将2个数组分解为spark Dataframe 的一列

xmjla07d  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(219)

我有以下示例数据,我将在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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题