我是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。
jecbmhm31#
使用 map 与 collect_list .
map
collect_list
val aggdf = df.groupBy($"col1").agg(map($"col1",collect_list($"col2")).alias("mapped")) aggdf.select($"mapped").show()
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]]| +----+---------------+
不是如你所愿,但我们离你更近了一步:)
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))
但请注意,对于大型数据集,这将导致爆炸
3条答案
按热度按时间jecbmhm31#
使用
map
与collect_list
.6yt4nkrj2#
这个怎么样:
不是如你所愿,但我们离你更近了一步:)
b5buobof3#
你可以这样做:
给予
但请注意,对于大型数据集,这将导致爆炸