首页 > 解决方案 > 即使只有一条记录未遵循架构,pyspark.sql 的explode() 也无法按预期工作

问题描述

我有一个 json 文件,我想通过将其中一个字段扩展为列来转换(比如 csv)。我为此使用了explode(),但即使许多记录之一没有确切的模式,它也会出错。

输入文件:

{“地点”:“KA”,“id”:“200”,“swversion”:“v.002”,“事件”:[{“时间”:“2020-05-23T22:34:32.770Z”, “开斋节”:24,“应用程序”:“测试”,“状态”:0}]}

{“地点”:“AP”,“id”:“100”,“swversion”:“v.001”,“事件”:[[]] }

在上面,我想扩展“事件”的字段,它们应该成为列。理想情况下,“事件”是一个结构类型的数组。

预期的输出文件列:

*地点、id、swversion、时间、eid、应用程序、状态*

为此,我使用了 pyspark.sql 中提供的explode(),但是因为我在输入文件中的第二条记录不遵循“events”是结构类型数组的架构,因此explode() 在此处失败并给出错误.

我用来爆炸的代码:

df = spark.read.json("InputFile")

ndf = df.withColumn("event", explode("events")).drop("events")

ndf.select("place", "id", "swversion", " event. *")

由于我的输入文件中的第二条记录,最后一行失败..

我相信,explode() 处理这个问题应该不会太难。你能建议如何避免

无法扩展星类型

标签: arraysjsonpysparkexplodeexpand

解决方案


如果我将“事件”:[[]] 更改为“事件”:[{}],explode() 工作正常,因为它又是一个 StructType 数组,但由于我无法控制输入数据,我需要处理这个。


推荐阅读