我有一个示例json数据文件,其结构如下:
{
"Header": {
"Code1": "abc",
"Code2": "def",
"Code3": "ghi",
"Code4": "jkl",
},
"TimeSeries": {
"2020-11-25T03:00:00+00:00": {
"UnitPrice": 1000,
"Amount": 10000,
},
"2020-11-26T03:00:00+00:00": {
"UnitPrice": 1000,
"Amount": 10000,
}
}
}
当我使用命令将其解析为数据块时:
df = spark.read.json("/FileStore/test.txt")
我得到两个输出对象:Header和TimeSeries。对于TimeSeries,我希望能够展平结构,使其具有以下模式:
Date
UnitPrice
Amount
由于日期字段是一个键,我目前只能通过迭代列名,然后在点表示法中动态使用它来访问它:
def flatten_json(data):
columnlist = data.select("TimeSeries.*")
count = 0
for name in data.select("TimeSeries.*"):
df1 = data.select("Header.*").withColumn(("Timeseries"), lit(columnlist.columns[count])).withColumn("join", lit("a"))
df2 = data.select("TimeSeries." + columnlist.columns[count] + ".*").withColumn("join", lit("a"))
if count == 0:
df3 = df1.join(df2, on=['join'], how="inner")
else:
df3 = df3.union(df1.join(df2, on=['join'], how="inner"))
count = count + 1
return(df3)
这远非理想。有人知道更好的方法来创建所描述的数据帧吗
这个想法:
步骤1:分别提取头和时间序列
步骤2:对于TimeSeries对象中的每个字段,提取
Amount
和UnitPrice
,连同字段的name
,将它们填充到一个结构中步骤3:将所有这些结构合并到一个数组列中,并分解它
步骤4:从分解的列中提取
Timeseries
、Amount
和UnitPrice
步骤5:与标题行交叉连接
输出:
相关问题 更多 >
编程相关推荐