반응형
def convert_value_na_to_null(value):
if value is None or (value == "") or (value.upper() == "NA"):
return None
else:
return int(value)
udf_convert_value_na_to_null = udf(convert_string_na_to_null, IntegerType())
converted_df3 = ( converted_df2.
withColumn("year", convert_string_na_to_null(col("year"))).
withColumn("month", convert_string_na_to_null(col("month"))).
withColumn("dayofmonth", convert_string_na_to_null(col("dayofmonth"))).
withColumn("dayofweek", convert_string_na_to_null(col("dayofweek"))).
withColumn("deptime", convert_string_na_to_null(col("deptime"))).
withColumn("crsdeptime", convert_string_na_to_null(col("crsdeptime"))).
withColumn("arrtime", convert_string_na_to_null(col("arrtime"))).
withColumn("crsarrtime", convert_string_na_to_null(col("crsarrtime"))).
withColumn("flightnum", convert_string_na_to_null(col("flightnum")))
)
- 발생 경위
- 파이썬에서 pyspark UDF를 등록하여 사용하는중에서 본문과 같은 에러가 생김
- 대처 방안
- 위에서도 나와있듯이 파이썬은 람다식을 활용할 수 있으나 다른 언어에 비해서 람다식이 표현식임에 동시에 제약이 있어 가독성이 저해가 될 수 있어서 함수로 관리하는데 pyspark는 현재 DataFrame API 만 지원하기 때문에 DataFrame에 관한 처리를 하려면 DataFrame에 맞게 처리를해야함
- 내가 쓴건 단순 파이썬 객체를 계산 하기 위한 함수 임으로 col이 들어가는 함수는 DataFrame 이기 떄문에 사실상 파이썬 객체가 아닌 DataFrame객체로 봐야함
수정 코드
def convert_string_na_to_null(value):
return when((value.isNull() | (value == "") | (value == lit("NA"))), None).otherwise(value.cast(IntegerType()))
반응형