본문 바로가기

오류모음집/spark

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

반응형

 

 

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")))
 )

 

  1. 발생 경위
    1. 파이썬에서 pyspark UDF를 등록하여 사용하는중에서 본문과 같은 에러가 생김
  2. 대처 방안 
    1. 위에서도 나와있듯이 파이썬은 람다식을 활용할 수 있으나 다른 언어에 비해서 람다식이 표현식임에 동시에 제약이 있어 가독성이 저해가 될 수 있어서 함수로 관리하는데 pyspark는 현재 DataFrame API 만 지원하기 때문에 DataFrame에 관한 처리를 하려면 DataFrame에 맞게 처리를해야함 
    2. 내가 쓴건 단순 파이썬 객체를 계산 하기 위한 함수 임으로 col이 들어가는 함수는 DataFrame 이기 떄문에 사실상 파이썬 객체가 아닌 DataFrame객체로 봐야함 

 

수정 코드 

def convert_string_na_to_null(value):
    return when((value.isNull() | (value == "") | (value == lit("NA"))), None).otherwise(value.cast(IntegerType()))
반응형