다음 문서 내용을 정리함
sparkbyexamples.com/pyspark/pyspark-where-filter/
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
'Python3' 카테고리의 다른 글
[PySpark] 문법 예제 : 날짜 다루기 (미완성) (0) | 2021.05.05 |
---|---|
[PySpark] 문법 예제 : when (0) | 2021.05.05 |
[IPython] Jupyter Notebook 에서 tab 자동완성이 안 먹히는 경우 해결했던 방법 (0) | 2021.04.27 |
[Python3] 객체와 인스턴스의 차이 (0) | 2021.04.26 |
[Python3] 값에 따라 객체가 정해진다?? (0) | 2021.04.26 |