我有一个数据框,其中的列是JSON字符串
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import pyspark.sql.functions as F
sc = SparkSession.builder.getOrCreate()
l = [
(1, """{"key1": true, "nested_key": {"mylist": ["foo", "bar"], "mybool": true}})"""),
(2, """{"key1": true, "nested_key": {"mylist": "", "mybool": true}})"""),
]
df = sc.createDataFrame(l, ["id", "json_str"])
,并希望使用模式使用json_str
来解析from_json
列
schema = StructType([
StructField("key1", BooleanType(), False),
StructField("nested_key", StructType([
StructField("mylist", ArrayType(StringType()), False),
StructField("mybool", BooleanType(), False)
]))
])
df = df.withColumn("data", F.from_json(F.col("json_str"), schema))
df.show(truncate=False)
+---+--------------------------+
|id |data |
+---+--------------------------+
|1 |[true, [[foo, bar], true]]|
|2 |[true, [, true]] |
+---+--------------------------+
可以看到,第二行不符合schema
中的架构,因此即使我在StructField中将False
传递给nullable
,它也为空。对于我的管道而言,重要的是,如果存在不符合定义的架构的数据,则警报会以某种方式引发,但我不确定在Pyspark中执行此操作的最佳方法。实际的数据有很多很多的键,其中有些键是嵌套的,因此用某种isNan
形式检查每个键是不可行的,并且由于我们已经定义了模式,因此感觉应该可以利用它了。
如果有关系,我不一定需要检查整个数据框的架构,而是在检查StructType列的架构之后。
答案 0 :(得分:0)
签出.modal td {padding:0} !important
参数:
https://spark.apache.org/docs/2.3.1/api/python/pyspark.sql.html?highlight=from_json#pyspark.sql.functions.from_json
这有点含糊,但是它允许您在此处将options
传递给基础方法:
https://spark.apache.org/docs/2.3.1/api/python/pyspark.sql.html?highlight=from_json#pyspark.sql.DataFrameReader.json
您可能会成功传递类似dict
之类的信息。