我有以下示例数据,我将在spark数据框中作为一行接收。
{
"id":"B07H3MVTSN",
"mid":44444,
"inner":{
"type1":[{
"cid":"B06XVVSLX8"
},
{
"cid":"B06XJ2JZ2Z"
},
{
"cid":"B06XJ2J12M"
}
],
"type2":[{
"cid":"B06XVVSLX1"
},
{
"cid":"B06XJ2JZ22"
},
{
"cid":"B06XJ2J123"
}
]
}
}
如何将上面的json结构转换为下面的结构,其中数组type1和type2被分解并放置在一列中,格式列中对应的列名为type1或type2?
id mid cid format
B07H3MVTSN 44444 B06XVVSLX8 type1
B07H3MVTSN 44444 B06XJ2JZ2Z type1
B07H3MVTSN 44444 B06XJ2J12M type1
B07H3MVTSN 44444 B06XVVSLX1 type2
B07H3MVTSN 44444 B06XJ2JZ22 type2
B07H3MVTSN 44444 B06XJ2J123 type2
目前我正在分别分解type1和type2,然后进行联合。
Dataset combinedDataset = spark.emptyDataFrame();
String[] types = {"type1", "type2"};
List<String> typesList = Arrays.asList(types);
for(String type : typeList){
boolean exists = df.schema().simpleString().contains(type);
if(exists) {
Dataset clonedDf = jsonDataset.toDF();
clonedDf = clonedDf
.withColumn("cid", org.apache.spark.sql.functions
.explode(clonedDf.col("inner." + type + ".cid")).as(type))
.withColumn("format", functions.lit(type))
.drop("inner");
if(combinedDataset.isEmpty()) {
combinedDataset = clonedDf;
} else {
combinedDataset = combinedDataset.union(clonedDf);
}
}
}
我发现的另一个方法是
df = df
.withColumn("cid", concat(col("inner.type1.cid"), col("inner.type3.cid")))
.withColumn("cid", explode(col("cid")).as("cid"))
输出:
id mid cid
B07H3MVTSN 44444 B06XVVSLX8
B07H3MVTSN 44444 B06XJ2JZ2Z
B07H3MVTSN 44444 B06XJ2J12M
B07H3MVTSN 44444 B06XVVSLX1
B07H3MVTSN 44444 B06XJ2JZ22
B07H3MVTSN 44444 B06XJ2J123
这将为我提供输出的第1列、第2列和第3列,但如何在format列中获得具有相应类型名称的第4列。
我想评估是否有一种更干净/有效的方法来降低产量?
id mid cid format
B07H3MVTSN 44444 B06XVVSLX8 type1
B07H3MVTSN 44444 B06XJ2JZ2Z type1
B07H3MVTSN 44444 B06XJ2J12M type1
B07H3MVTSN 44444 B06XVVSLX1 type2
B07H3MVTSN 44444 B06XJ2JZ22 type2
B07H3MVTSN 44444 B06XJ2J123 type2
暂无答案!
目前还没有任何答案,快来回答吧!