如何将dataframe转换为以key作为列值之一的map?

k2arahey  于 2021-05-29  发布在  Spark
关注(0)|答案(3)|浏览(1265)

我是spark/scala的新手,我的问题是我有一个如下的Dataframe:

Col1 | Col2
a      1
a      2
a      3
b      4
b      5

我想创建一个这样的Map

a-> [1,2,3]
b-> [4,5]

我面临的问题是基于col1值组合col2值,然后创建一个键为col1值的Map。

jecbmhm3

jecbmhm31#

使用 mapcollect_list .

val aggdf = df.groupBy($"col1").agg(map($"col1",collect_list($"col2")).alias("mapped"))
aggdf.select($"mapped").show()
6yt4nkrj

6yt4nkrj2#

这个怎么样:

val x = df.withColumn("x", array("col2"))
    .groupBy("col1")
    .agg(collect_list("x"))

x.show()

+----+---------------+
|col1|collect_list(x)|
+----+---------------+
|   b|     [[4], [5]]|
|   a|[[1], [2], [3]]|
+----+---------------+

不是如你所愿,但我们离你更近了一步:)

b5buobof

b5buobof3#

你可以这样做:

val df = Seq(
  ("a",1),
  ("a",2),
  ("a",3),
  ("b",4),
  ("b",5)
).toDF("col1","col2")

val map: Map[String, Seq[Int]] = df.groupBy($"col1")
  .agg(collect_list($"col2"))
  .as[(String,Seq[Int])]
  .collect().toMap

给予

Map(b -> List(4, 5), a -> List(1, 2, 3))

但请注意,对于大型数据集,这将导致爆炸

相关问题