Spark数据集。数组中的struct struct列

时间:2017-03-30 20:08:08

标签: apache-spark dataframe grouping collapse

我想要合并两个json文件。

他们看起来像这样:

元素:

{
  "id" : 1,
  "style": {
      "availableColors": [1,3,5,8]
      "material" : "Iron"
       .
       .
       .
      }
  .
  .
  .
}

颜色

{
  "colorId" : 1,
  "definition": {
      "R": 13,
      "G" : 23,
      "B" : 4
      }
   "tags": ["...", "..."]
  .
  .
  .
}

我已经在DF中转换了每个人,我按照以下方式加入他们:

val joined = elemDF.join(colorDF, $"style.id".cast("string").contains($"colorId"))

但在这种情况下,每个id都有与colorIds一样多的条目。

我怎样才能"分组"数组中的颜色,最后就像为每个元素添加一个颜色结构数组?

也许使用udf而不是加入数据帧?

我想避免使用类来表示行,因为json可以有很多字段和级别,我现在不应该关心。

1 个答案:

答案 0 :(得分:1)

终于得到了解决方案。如果有人遇到同样的问题,我会添加它。

def toColumns(colNames: Array[String]) = {
  colNames.map(x => col(x))
}

val joined = elemDF.join(colorDF, $"style.id".cast("string").contains($"colorId"))
                   .withColumn("color", 
                            struct(toColumns(colorDF.schema.fieldNames): _*)



joined.groupBy(toColumns(elemDF.schema.fieldNames): _*)
      .agg(collect_list($"color").as("colors"))