【问题标题】:from_json Pyspark SQL function: default value for not found keys?from_json Pyspark SQL 函数:未找到键的默认值?
【发布时间】:2019-04-12 04:27:46
【问题描述】:

我照常使用from_json Pyspark SQL 函数,例如:

>>> import pyspark.sql.types as t
>>> from pyspark.sql.functions import from_json
>>> df = sc.parallelize(['{"a":1}', '{"a":1, "b":2}', '{"a":1, "b":2, "c":3}']).toDF(t.StringType())
>>> df.show(3, False)
+---------------------+
|value                |
+---------------------+
|{"a":1}              |
|{"a":1, "b":2}       |
|{"a":1, "b":2, "c":3}|
+---------------------+

>>> schema = t.StructType([t.StructField("a", t.IntegerType()), t.StructField("b", t.IntegerType()), t.StructField("c", t.IntegerType())])
>>> df.withColumn("json", from_json("value", schema)).show(3, False)
+---------------------+---------+
|value                |json     |
+---------------------+---------+
|{"a":1}              |[1,,]    |
|{"a":1, "b":2}       |[1, 2,]  |
|{"a":1, "b":2, "c":3}|[1, 2, 3]|
+---------------------+---------+

请注意那些不存在于 JSON 中但在架构中指定的键的解析值为 null(或某种空值?)。

如何避免这种情况?我的意思是,有没有办法将默认值设置为from_json?还是我必须在数据帧的后期处理中添加这样的默认值?

谢谢!

【问题讨论】:

  • 对我来说,它会产生正确的输出:[1,null,null] 用于第一行等。所以也许您为 from_json 设置了一些与默认值不同的选项?
  • 嗨,@gaw,感谢您的回答。我知道这种行为是正确的。我需要知道的是,是否有某种方法可以为 JSON 中不存在的键设置默认值。例如。我怎么能设置它而不是添加一个null值到列表中,一个0.0值必须添加。
  • 我认为直接不可能,文档说明它具有与普通 json 数据源相同的选项参数,但没有 nullValue 或类似选项的选项。因此,您可能需要在后处理步骤中进行此操作
  • 明白,非常感谢!

标签: python apache-spark pyspark pyspark-sql


【解决方案1】:

你可以试试

df = self.spark.createDataFrame(['{"a":1}', '{"a":1, "b":2}', '{"a":1, "b":2, "c":3}'], StringType())

df.show(3, False)
df = df.withColumn("a", get_json_object("value", '$.a')) \
       .withColumn("b",when(get_json_object("value", '$.b').isNotNull(), get_json_object("value", '$.b')).otherwise(0)) \
       .withColumn("c",when(get_json_object("value", '$.c').isNotNull(), get_json_object("value", '$.c')).otherwise(0))

df.show(3, False)


+---------------------+
|value                |
+---------------------+
|{"a":1}              |
|{"a":1, "b":2}       |
|{"a":1, "b":2, "c":3}|
+---------------------+

+---------------------+---+---+---+
|value                |a  |b  |c  |
+---------------------+---+---+---+
|{"a":1}              |1  |0  |0  |
|{"a":1, "b":2}       |1  |2  |0  |
|{"a":1, "b":2, "c":3}|1  |2  |3  |
+---------------------+---+---+---+

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 2011-11-23
    • 2023-04-01
    • 2018-02-10
    • 2017-02-28
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多