Spark:如何将JSON中的空字符串解析为null

4

我有这样的数据:

{"domain_userid":"a","g_id":"1"}
{"domain_userid":"b"}
{"domain_userid":"c","g_id":""}

我正在使用以下代码将此加载到DataFrame中:

spark.read.schema(myschema).json("/my/json") 

这将导致一个像这样的数据框:
+--------------------+--------+
|       domain_userid|g_id    |
+--------------------+--------+
|a                   | 1      |
|b                   | null   |
|c                   |        |

What I'm looking for is

+--------------------+--------+
|       domain_userid|g_id    |
+--------------------+--------+
|a                   | 1      |
|b                   |    null|
|c                   |    null|

我知道我可以编写一个UDF来将空字符串映射到null,但是我的数据有许多列(100+),因此这似乎可能会有性能损失,因为涉及到许多转换。是否有JSON解析器上的任何标志/选项可以从一开始就只写入null?


1
你可以使用 regexp_replace 代替 UDF。 - T. Gawęda
2个回答

1

0

JSON 文件:

{"domain_userid":"","g_id":"1"}
{"domain_userid":"b"}
{"domain_userid":"c","g_id":""}

试试这个:

df = spark.read.load('file:///home/zht/PycharmProjects/test/json_file.json', format='json')

myfunc = f.UserDefinedFunction(lambda *args: map(lambda x: None if x == '' else x, args),
                               returnType=ArrayType(StringType()))
cols = df.columns
df = df.select(myfunc(*cols)).rdd.flatMap(lambda x: x)
df = spark.createDataFrame(df, schema=cols)
df.show()

并输出:

+-------------+----+
|domain_userid|g_id|
+-------------+----+
|         null|   1|
|            b|null|
|            c|null|
+-------------+----+

1
这个方法可以工作,但并没有回答我的问题。我问的是是否存在一种解析标志/选项,可以将空字符串视为null,这样我就可以不编写UDF来解决这个问题。此外,这个解决方案假设所有列都是StringType,但实际情况并非如此(我使用模式进行解析)。因此,你应该使用df.dtypes而不是df.columns。 - rdeboo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接