pyspark 将列中的值集替换为NULL

kx5bkwkv  于 2024-01-06  发布在  Spark
关注(0)|答案(1)|浏览(178)

我有一个有~100列的数组,有各种类型,包括StringType(),IntegerType(),BooleanType(),ArrayType(StringType())。这些列(包括布尔/数组类型)中很少有来自数据提供程序的垃圾值,如垃圾,NULL,默认值等。我需要用NULL替换这些值,而不是NULL字符串。

  1. values_to_replace = ["junk", "NULL","default"]
  2. replacement_value = None
  3. for column in df.columns:
  4. df = df.withColumn(column, when(col(column).isin(values_to_replace), replacement_value).otherwise(col(column)))

字符串

问题:上面的替换部分对于字符串类型很好,但是当处理非字符串数据类型的列时会出错,比如boolean/array。

无法解析“(col_name1 IN(junk,NULL,default))”,因为数据类型不匹配:in的输入应该都是同一类型,但它是[“ARRAY”,“STRING”,“STRING”,“STRING”]。
无法解析“(col_name2 IN(junk,NULL,default))”,因为数据类型不匹配:in的输入应该都是同一类型,但它是[“BOOLEAN”,“STRING”,“STRING”,“STRING”]。
我们如何处理所有数据库的替换?

jtoj6r0c

jtoj6r0c1#

如果希望使用ISIN对所有数据类型使用通用逻辑,则可以临时将非字符串列转换为字符串类型,以进行替换操作

  1. from pyspark.sql.functions import when, col
  2. from pyspark.sql.types import StringType
  3. values_to_replace = ["junk", "NULL", "default"]
  4. replacement_value = None
  5. for column in df.columns:
  6. # Convert non-string columns to StringType for replacement
  7. df = df.withColumn(
  8. column,
  9. when(col(column).cast(StringType()).isin(values_to_replace),
  10. replacement_value).otherwise(
  11. col(column)
  12. )
  13. )
  14. # Ensure consistent NULL representation for all data types
  15. df = df.na.fill(replacement_value)

字符串

展开查看全部

相关问题