我正在尝试根据其ID将Dataframe拆分为多个数组。
所以我有一张桌子
id|name
12|a
12|b
12|c
13|z
13|y
13|z
我希望得到多个看起来像的矢量:
<a,b,c> <x,y,z>
所以我设法使用以下方法获取所有不同的ID:
val ids=dataframe.select("id").distinct.collect.flatMap(_.toSeq)
那将返回12和13。 我试图为他们每个人找到名字:
val namesArray=ids.map(id=>dataframe.where($"id"===id))
但这似乎不是因为它返回列名,我应该找到一种方法只从中获取名称。
答案 0 :(得分:1)
如果您的数据已经有DataSet
,那么您可以执行以下操作,
val yourDataSet = sc.parallelize(List((12, "a"), (12, "b"), (13, "y"), (13, "z"))).toDF("id", "val")
val requiredDataSet = yourDataSet
.groupBy("id")
.agg(collect_list("val"))
.select("collect_list(val)")
或者你可以通过获取底层的Rdd然后转换它来实现这一点。
val vaueVectorRdd = dataframe.rdd
.map(row.getInt(0), row.getString(1))
.groupByKey({ case (k, v) => k })
.map({ case (k, iter) => iter.map(_._2).toVector })