PySpark将空字符串转换为null并在Parquet中写入

时间:2019-12-11 08:32:25

标签: python pyspark parquet

我正在尝试将空字符串转换为Null(无),然后以Parquet格式写出。

但是,输出仍然是一个空字符串,而不是Null(无)。有什么需要改变的想法吗?我正在使用Spark 2.4Python 3

注意:在应用以下内容之前,我正在检查“字符串数据类型”列,但为简化此问题,我将其省略。

from pyspark.sql import functions as psf

for column in df.columns:
    df_new = df.withColumn(
        column,
        psf.when(
            psf.length(
                psf.trim(
                    psf.col(column)
                )
            ) != 0,
            psf.trim(psf.col(column))).otherwise(None))

1 个答案:

答案 0 :(得分:1)

因为您要将转换的返回值分配给df_new,并且Spark转换创建了一个 new DataFrame(DataFrame是不可变的结构),所以您基本上只更改了最后一个(字符串)列。

df = spark.createDataFrame((("a", "b"), ("", "b"), ("a", "")), schema=("A", "B"))

for column in df.columns:
    trimmed = psf.trim(psf.col(column))
    df_new = df.withColumn(
        column,
        psf.when(psf.length(trimmed) != 0, trimmed)
        .otherwise(None))
df_new.show()
# +---+----+
# |  A|   B|
# +---+----+
# |  a|   b|
# |   |   b|
# |  a|null|
# +---+----+

但是,如果将df_new = df.withColumn(行更改为df = df.withColumn(,则会得到所需的结果:

for column in df.columns:
    trimmed = psf.trim(psf.col(column))
    df = df.withColumn(
        column,
        psf.when(psf.length(trimmed) != 0, trimmed)
        .otherwise(None))

df.show()
# +----+----+
# |   A|   B|
# +----+----+
# |   a|   b|
# |null|   b|
# |   a|null|
# +----+----+