arrays - 即使只有一条记录未遵循架构,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() 处理这个问题应该不会太难。你能建议如何避免
无法扩展星类型
解决方案
如果我将“事件”:[[]] 更改为“事件”:[{}],explode() 工作正常,因为它又是一个 StructType 数组,但由于我无法控制输入数据,我需要处理这个。
推荐阅读
- android - ClassNotFoundException:kotlin.KotlinNothingValueException 使用带有 build.gradle.kts 的 Android Studio 4.2 Canary 8
- reactjs - 在 React 中有条件地使用自定义钩子
- java - 导出到 jar 时出现 ClassFileArchiveEntryHandler 错误
- dart - 无法向下转换列表
到列表 - javascript - 如何将 parentNode 与 add/removeClass 和 IF 参数一起使用
- reactjs - React - 使用 Axios 调用 API,如何将 onClick 事件与 API 调用绑定
- python - Python Discord bot 不会运行命令,但会运行 on_message(),这是为什么呢?
- javascript - 输入类型 = 时间 如何设置 5 分钟间隔并在时间 SELECTED 或按钮关闭时关闭菜单 EDIT
- python - 尝试从数组中抓取 Yahoo Finance 时“必须是 str,而不是列表”
- java - Java - 避免模式重复