在Pyspark 2.4中使用StructType验证列的架构

时间:2019-09-19 05:19:16

标签: apache-spark pyspark apache-spark-sql

我有一个数据框,其中的列是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列的架构之后。

1 个答案:

答案 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之类的信息。