问题描述
我有以下示例数据,我将在 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 列,但我如何在格式列中获得具有各自类型名称的第 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
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)