我手头有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)
所有人都抱怨groupBy
或groupByKey
模糊不清或找不到方法错误。任何帮助表示赞赏。
我尝试了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))
答案 0 :(得分:0)
如果你有一对RDD,那么你可以使用combineByKey()。要做到这一点,你必须传递3个方法作为参数。
方法1采用String,例如'City1'作为输入,将该String添加到空List并返回该列表 方法2采用String,例如'CityX'和前一方法创建的列表之一。将String添加到列表并返回列表。 方法3将2个列表作为输入。它返回一个包含2个参数列表中所有值的新列表
combineByKey将返回RDD&gt;。
但是在你的情况下,你开始使用DataFrame,我没有多少经验。我想你需要将它转换为RDD才能使用combineByKey()