对可变数量的列/行进行排序

时间:2015-07-19 13:22:59

标签: python apache-spark pyspark

users_grpd = pairs.groupByKey()

users_grpd_flattened = users_grpd.map(
    lambda (k, vals): "{0} {1}".format(k, ' '.join(str(x) for x in vals)))

userid中的第一列,其余列是产品ID。我现在想对每个用户的产品ID进行排序。每个用户的产品数量不固定,但会有所不同。以下是users_grpd_flattened的样子:有没有办法有效地对产品ID /用户进行排序?

userid   product ids.............

30095212 208518 10519 208520 120821
3072220 20506 205037
209212 208518 10519 208520 120821
100222 20506 205037 10519 208520 120821 20116  124574 102575

1 个答案:

答案 0 :(得分:0)

您可以将mapValuessorted一起使用。

$html .= "<div class='post-text'>" . get_the_excerpt() . "</div><p><a href='" . get_the_permalink() . "'> Läs mer...</a></p>"; 

当您使用users_grpd.mapValues(sorted) 时,保留了输入分区,因此不会出现任何混乱,并且最昂贵且有潜在危险的操作在mapValues之前。

检查一切是否按预期工作(groupByKey取自@WaiYipTung answer):

is_sorted

一些检查

def is_sorted(l):
    return all(l[i] <= l[i+1] for i in xrange(len(l)-1))

pairs = sc.parallelize([
    (30095212, 208518), (30095212, 10519), (30095212, 208520), 
    (30095212, 120821), (3072220, 20506), (3072220, 205037),
    (209212, 208518), (209212, 10519), (209212, 208520), (209212, 120821),
    (100222, 20506), (100222, 205037), (100222, 10519), (100222, 208520),
    (100222, 120821), (100222, 20116), (100222, 124574), (100222, 102575),
    (87620, 12012851), (87620, 12022661), (87620, 12033827), (87620, 1205376)
])

users_grpd_with_sorted_vals = pairs.groupByKey().mapValues(sorted)