from_json SQL-функция Pyspark: значение по умолчанию для не найденных ключей? - PullRequest
1 голос
/ 11 апреля 2019

Я использую функцию from_json Pyspark SQL, как обычно, например ::100100

>>> 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 Ответ

1 голос
/ 11 апреля 2019

Можно попробовать

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  |
+---------------------+---+---+---+

...