在spark python中按值分组

时间:2015-10-01 10:38:31

标签: python apache-spark pyspark

我尝试按照

等原始键值对按值进行分组
Ctrl2

我可以使用groupByKey()方法按键分组,但我找不到按值分组的方法

var mySharedValue = shared.getValue();

我检查了spark API文档,但找不到任何方法

4 个答案:

答案 0 :(得分:2)

Spark的RDD有一个groupBy运算符,您可以在其中传递自定义的groupBy函数。

data = sc.parallelize([(1, a), (2, a), (3, a), (4, a), (3, b), (1, b), (1, c), (4, c), (4, d)])
data.groupBy(lambda tup: tup[1])

这将按值(元组的第二个元素)对数据进行分组。请注意,groupBy和groupByKey可能导致内存不足异常并且操作费用昂贵。见Avoid GroupByKey

答案 1 :(得分:1)

你可以通过在RDD中反转元组来实现这一点,

RDD.map(lambda s: reversed(s))

[(1, a), (2, a),....]

将成为

[(a, 1), (a, 2),....]

现在是groupByKey()。

虽然我不确定效率,但它会起作用:)

答案 2 :(得分:0)

input = sc.parallelize([(1,"a"),(2,"a"),(3,"a"),(4,"a"),(1,"b"),(3,"b"),(1,"c"),(4,"c"),(4,"d")])
input.groupByKey().collect()
output1 = input.map(lambda (x,y):(y,x))
 output2 = output1.groupByKey()
output2.collect()

答案 3 :(得分:-2)

您可以使用此脚本

它将按价值分组。

vals = [(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (3, 'b'), (1, 'b'), (1, 'c'), (4, 'c'), (4, 'd')]

lst = {}
for k,v in vals:
    if v in lst.keys():
        lst[v] = lst[v] + [k]
    else:
        lst[v] = [k]
print(lst)