按键然后按值排序,然后将其分组... pyspark

时间:2017-10-05 14:10:22

标签: sorting pyspark

所以我试图以这种格式对数据进行排序......

[((0, 4), 3), ((4, 0), 3), ((1, 6), 1), ((3, 2), 3), ((0, 5), 1)...

按键升序然后按值降序。我能够通过......实现这一目标。

test = test.sortBy(lambda x: (x[0], -x[1]))

这将基于上面的缩短版本给我...

[((0, 4), 3), ((0, 5), 1), ((1, 6), 1), ((3, 2), 3), ((4, 0), 3)...

我遇到的问题是在排序后我不再需要该值,但需要在对数据进行分组后保留排序。所以......

test = test.map(lambda x: (x[0][0],x[0][1]))

给我......

[(0, 4), (0, 5), (1, 6), (3, 2), (4, 0)...

仍然按照我需要的顺序,但我需要按键对元素进行分组。然后我使用这个命令......

test = test.groupByKey().map(lambda x: (x[0], list(x[1])))

但是在这个过程中我失去了分类。有什么办法保留吗?

1 个答案:

答案 0 :(得分:0)

我设法通过更改元组的格式来保留订单......

test = test.map(lambda x: (x[0][0],(x[0][1],x[1]))
test = test.groupByKey().map(lambda x: (x[0], sorted(list(x[1]), key=lambda x: (x[0],-x[1]))))

[(0, [(4, 3), (5, 1)] ... 

给我留下了我想要摆脱的价值(元组中的第二个元素)但是也照顾了它......

test = test.map(lambda x: (x[0], [e[0] for e in x[1]]))

感觉有点hacky但不确定如何做到这一点。