微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将 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 举报,一经查实,本站将立刻删除。