다음 문서 내용을 정리함

sparkbyexamples.com/pyspark/pyspark-where-filter/

 

PySpark Where Filter Function | Multiple Conditions — SparkByExamples

PySpark filter() function is used to filter the rows from RDD/DataFrame based on the given condition or SQL expression, you can also use where() clause

sparkbyexamples.com

 

pyspark 의 dataframe 에서 column 의 내용을 기준으로 필터링하는 방법에 대해 설명한다.

filter, 혹은 where 함수를 사용하는데,

둘 다 똑같은 기능을 하기 때문에 편한 것을 선택해 사용하면 된다.

나는 filter 를 사용함.

 

샘플 dataframe 을 만들어본다.

from pyspark.sql.types import StructType,StructField
from pyspark.sql.types import StringType, IntegerType, ArrayType
data = [
    (("James","","Smith"),["Java","Scala","C++"],"OH","M",1),
    (("Anna","Rose",""),["Spark","Java","C++"],"NY","F",2),
    (("Julia","","Williams"),["CSharp","VB"],"OH","F",3),
    (("Maria","Anne","Jones"),["CSharp","VB"],"NY","M",4),
    (("Jen","Mary","Brown"),["CSharp","VB"],"NY","M",5),
    (("Mike","Mary","Williams"),["Python","VB"],"OH","M",6)
 ]
       
schema = StructType([
     StructField('name', StructType([
        StructField('firstname', StringType(), True),
        StructField('middlename', StringType(), True),
         StructField('lastname', StringType(), True)
     ])),
     StructField('languages', ArrayType(StringType()), True),
     StructField('state', StringType(), True),
     StructField('gender', StringType(), True),
     StructField('num', IntegerType(), True)
 ])
 
df = spark.createDataFrame(data = data, schema = schema)
df.printSchema()
df.show(truncate=False)

 

다음과 같은 조건문을 걸어 필터링이 가능하다.

 


#다양한 조건문
df.filter(df.state == "OH").show()
df.filter(df.state != "OH").show()
df.filter(~(df.state == "OH")).show()
df.filter("gender == 'M'").show()
df.filter("gender != 'M'").show()
df.filter("gender <> 'M'").show()
df.filter(df.num < 3).show()
df.filter(df.num <= 3).show()
df.filter(df.num > 3).show()
df.filter(df.num >= 3).show()
condition = col(num)>= 3
df.filter(condition).show()

#조건문의 and or 결합
df.filter((df.state == "OH") & (df.num < 5)).show()
df.filter((df.state == "OH") | (df.num < 5)).show()

#SQL 의 like 문장 사용
df.filter(df.state.like("_Y")).show()

#regex 조건이 참이면 필터링
df.filter(df.gender.rlike("[M]")).show()

#df의 값이 바깥에 존재하는 list 내에 존재하는지 확인
li=["OH","CA","DE"]
df.filter(df.state.isin(li)).show()
df.filter(~df.state.isin(li)).show()
df.filter(df.state.isin(li)==False).show()

#내부에 존재하는 list 내에 조건문의 값이 존재하는지 확인
from pyspark.sql.functions import array_contains
df.filter(array_contains(df.languages, "Java")).show()

#조건문장으로 시작하는지, 끝나는지 아니면 조건문장을 포함하는지 확인
df.filter(df.state.startswith("N")).show()
df.filter(df.state.endswith("Y")).show()
df.filter(df.state.contains("N")).show()
df.filter(df.languages.lastname == "Jones").show()

#배열 내의 값을 기준으로 필터링
df.filter(df.languages[1] == "VB").show()

#StructType 내의 값을 기준으로 필터링
df.filter(df.name.firstname.=="Anna").show()
df.filter(df.name.firstname.startswith("A")).show()

#null 처리 [참고]
#null 값만 추출하도록 필터링
df.filter(col("name").isNull()).show()

#null 값이 아닌 것만 필터링
df.filter(col("name").isNotNull()).show()

#유일한 값만 필터링 (distinct)
df.distinct().show()

 

위처럼 df.state 등으로 사용해도 좋고, col("state") 등으로 사용해도 좋다.

col 을 사용하려면 아래 모듈을 import 해야 함

 

from pyspark.sql.functions import col

 

 

 

 

spark.apache.org/docs/3.1.1/api/python/getting_started/quickstart.html

spark.apache.org/docs/latest/api/python/_modules/pyspark/sql/functions.html

spark.apache.org/docs/latest/structured-streaming-programming-guide.html

 

 

 

+ Recent posts