Apache Spark - 如何使用groupBy groupByKey形成(Key,List)对

时间:2017-10-09 23:13:59

标签: apache-spark dataframe

我手头有org.apache.spark.sql.DataFrame = [id: bigint, name: string]  其中的示例数据如下所示:

(1, "City1")
(2, "City3")
(1, "CityX")
(4, "CityZ")
(2, "CityN")

我正在尝试形成像

这样的输出
(1, ("City1", "CityX"))
(2, ("City3", "CityN"))
(4, ("CityZ"))

我尝试了以下变种

df.groupByKey.mapValues(_.toList).show(20, false)
df.groupBy("id").show(20, false)
df.rdd.groupByKey.mapValues(_.toList).show(20, false)
df.rdd.groupBy("id").show(20, false)

所有人都抱怨groupBygroupByKey模糊不清或找不到方法错误。任何帮助表示赞赏。

我尝试了Spark Group By Key to (Key,List) Pair中发布的解决方案,但这对我不起作用,但失败并出现以下错误:

<console>:88: error: overloaded method value groupByKey with alternatives:
  [K](func: org.apache.spark.api.java.function.MapFunction[org.apache.spark.sql.Row,K], encoder: org.apache.spark.sql.Encoder[K])org.apache.spark.sql.KeyValueGroupedDataset[K,org.apache.spark.sql.Row] <and>
  [K](func: org.apache.spark.sql.Row => K)(implicit evidence$3: org.apache.spark.sql.Encoder[K])org.apache.spark.sql.KeyValueGroupedDataset[K,org.apache.spark.sql.Row]
 cannot be applied to ()

感谢。

编辑:

我确实尝试了以下内容:

val result = df.groupBy("id").agg(collect_list("name"))

给出了

org.apache.spark.sql.DataFrame = [id: bigint, collect_list(node): array<string>]

我不知道如何使用这个collect_list类型..我试图通过执行将此转储到文件

result.rdd.coalesce(1).saveAsTextFile("test")

我看到以下

(1, WrappedArray(City1, CityX))
(2, WrappedArray(City3, CityN))
(4, WrappedArray(CityZ))

如何将此转储如下?

(1, (City1, CityX))
(2, (City3, CityN))
(4, (CityZ))

1 个答案:

答案 0 :(得分:0)

如果你有一对RDD,那么你可以使用combineByKey()。要做到这一点,你必须传递3个方法作为参数。

方法1采用String,例如'City1'作为输入,将该String添加到空List并返回该列表 方法2采用String,例如'CityX'和前一方法创建的列表之一。将String添加到列表并返回列表。 方法3将2个列表作为输入。它返回一个包含2个参数列表中所有值的新列表

combineByKey将返回RDD&gt;。

但是在你的情况下,你开始使用DataFrame,我没有多少经验。我想你需要将它转换为RDD才能使用combineByKey()