将 2 个数组分解为一列 spark 数据帧

问题描述

我有以下示例数据,我将在 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 (将#修改为@)