python - PySpark 将空字符串转换为 null 并写入 Parquet

标签 python pyspark parquet

我正在尝试将空字符串转换为 Null (None),然后以 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,并且 Spark 转换创建了一个 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|
# +----+----+

关于python - PySpark 将空字符串转换为 null 并写入 Parquet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59281615/

相关文章:

python - 有没有一个程序可以缩短这个时间?

Python:将目录和文件名存储为数据框列

java - 如何使用 s3 select 从 Parquet 文件中获取所有列的列表?

apache-spark-sql - 为什么 Spark SQL 中嵌套列的查询性能不同?

javascript - Python:如何访问网页,单击特定链接并将其中的数据复制到文本文件?

apache-spark - 打印 ResultIterable 对象的内容

azure - 尝试使用 PySpark 从 ADLS Gen2 读取 csv 时,没有方案 "az"的文件系统错误

apache-spark - 如何访问Spark DataFrame中VectorUDT列的元素?

apache-spark - 使用 Spark 生成拼花数据文件以测试 Hive/Presto/Drill/等的快速方法是什么?

python - Ipython 控制台不返回summary()的输出