我正在尝试将空字符串转换为 Null (None),然后以 Parquet 格式写出。
但是,输出仍然是一个空字符串,而不是 Null (None)。有什么想法我需要改变吗?我正在使用 Spark 2.4
和 Python 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/