我正在尝试将复杂的json文件读入spark数据帧。 Spark识别模式,但将字段错误地视为字符串,恰好是一个空数组。 (当它必须是数组类型时,不确定为什么它是String类型) 以下是我期待的样本
arrayfield:[{"name":"somename"},{"address" : "someadress"}]
目前数据如下
arrayfield:[]
这对我的代码的作用是,当我尝试查询arrayfield.name时它会失败。我知道我可以在读取文件时输入模式,但由于json结构非常复杂,所以从头开始编写它并不会真正解决问题。我尝试使用df.schema(在StructType中显示)获取模式并根据我的要求修改它,但是如何将字符串传递回StructType?这可能真的很傻但我发现很难解决这个问题。是否有任何工具/实用程序可以帮助我生成strutType
答案 0 :(得分:1)
您需要将StructType对象传递给DF构造函数。
让我们说你的DF在执行
后出错了df.schema
打印输出如下:
StructType(List(StructField(data1,StringType,true),StructField(data2,StringType,true)))
所以,您需要将此字符串翻译成可执行脚本。
为类型添加导入
from pyspark.sql.types import *
将列表和括号更改为python的括号
List() -> []
在每个类型声明后添加括号
StringType -> StringType()
修复布尔值字符串
true -> True
将其分配给变量
schema = StructType([
StructField("data1", StringType(),True),
StructField("data2", StringType(),True)])
创建新的DF对象
spark.read.csv(path, schema=schema)
你已经完成了。