Spark数据框会爆炸一对列表

时间:2017-08-09 08:53:19

标签: scala apache-spark dataframe

我的数据框有2列,如下所示:

col_id| col_name
-----------
id1   | name1
id2   | name2
------------
id3   | name3
id4   | name4
....

因此对于每一行,列id和名称中有2个相同长度的匹配数组。我想要的是将每对id / name作为一个单独的行,如:

col_id| col_name
-----------
id1   | name1
-----------
id2   | name2
....

explode似乎是要使用的功能,但我似乎无法让它工作。我试过的是:

rdd.explode(col("col_id"), col("col_name")) ({
case row: Row =>
  val ids: java.util.List[String] = row.getList(0)
  val names: java.util.List[String] = row.getList(1)

  var res: Array[(String, String)] = new Array[(String, String)](ids.size)
  for (i <- 0 until ids.size) {
    res :+ (ids.get(i), names.get(i))
  }
  res
})

然而,这只返回空值,因此可能只是我对Scala的了解不足。有谁可以指出这个问题?

1 个答案:

答案 0 :(得分:0)

看起来过去1-2小时的最后10分钟做了诀窍lol。这很好用:

df.explode(col("id"), col("name")) ({
case row: Row =>
  val ids: List[String] = row.getList(0).asScala.toList
  val names: List[String] = row.getList(1).asScala.toList

  ids zip names
})