pyspark 无法停止将空字符串读取为 null (spark 3.0)

Posted

技术标签:

【中文标题】pyspark 无法停止将空字符串读取为 null (spark 3.0)【英文标题】:pyspark can't stop reading empty string as null (spark 3.0) 【发布时间】:2021-05-24 14:05:37 【问题描述】:

我有一个这样的 csv 数据文件(^ 作为分隔符):

ID name age
0
1 Mike 20

当我这样做时

df = spark.read.option("delimiter", "^").option("quote","").option("header", "true").option(
        "inferSchema", "true").csv(xxxxxxx)

spark 会将第 0 行之后的第 2 列默认为空

df.show():
ID name age
0 null null
1 Mike 20

如何阻止 pyspark 将数据读取为 null 但只是空字符串?

我已经尝试在最后添加一些选项

1,option("nullValue", "xxxx").option("treatEmptyValuesAsNulls", False)
2,option("nullValue", None).option("treatEmptyValuesAsNulls", False)
3,option("nullValue", None).option("emptyValue", None)
4,option("nullValue", "xxx").option("emptyValue", "xxx")

但是无论我做什么 pyspark 仍然将数据读取为 null.. 有没有办法让 pyspark 按原样读取空字符串?

谢谢

【问题讨论】:

【参考方案1】:

看起来自Spark Version 2.0.1 以来的空值被视为空值。实现结果的一种方法是使用df.na.fill(...)

df = spark.read.csv('your_data_path', sep='^', header=True)
# root
#  |-- ID: string (nullable = true)
#  |-- name: string (nullable = true)
#  |-- age: string (nullable = true)

# Fill all columns
# df = df.na.fill('')

# Fill specific columns
df = df.na.fill('', subset=['name', 'age'])

df.show(truncate=False)

输出

+---+----+---+
|ID |name|age|
+---+----+---+
|0  |    |   |
|1  |Mike|20 |
+---+----+---+

【讨论】:

以上是关于pyspark 无法停止将空字符串读取为 null (spark 3.0)的主要内容,如果未能解决你的问题,请参考以下文章

在使用 VB.NET 的 Access 中将空字符串字段插入为 null

将ORACLE中查询结果为空字符串的变成null该怎么做

将空字符串转换为 null 的 Groovy 方法

MySQL可以自动将空字符串转换为NULL吗?

在 PySpark 中写入镶木地板的问题

SSIS 空值问题