【问题标题】:PySpark convert empty string to null and write in ParquetPySpark 将空字符串转换为 null 并在 Parquet 中写入
【发布时间】:2020-04-04 11:44:04
【问题描述】:

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

但是,输出仍然是一个空字符串,而不是 Null (None)。有什么想法我需要改变吗?我正在使用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))

【问题讨论】:

  • 您的代码不仅试图用空值替换空字符串"",因为您正在修剪它们。现在假设您正在将df_new 写入镶木地板文件,您的代码只会用空值替换最后一列,因为您在循环中执行df_new = df...。您也可以使用df.replace("", None) 将所有内容替换为空值,尽管您必须先修剪列。

标签: python pyspark parquet


【解决方案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|
# +----+----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多