首页 > 解决方案 > 返回每个键具有最高值的行,而不会丢失 RDD 中的整行

问题描述

我开始玩 pyspark RDD 和 DF。有了 SQL 知识,我对 DF 及其 SQL 模块感到满意。但是,我正在努力过滤纯 RDD 中的行而不将其转换为 DF。在下面的示例中,我想为第一列找到最高的第三列并返回整行或仅返回第二行并按第一列排序。在 DF 中,我将按第一列使用窗口并对每一行进行排名,然后根据排名过滤行。

Data = sc.parallelize([((12, u'IL'), -1.4944293272864724),
                       ((10, u'NM'), 14.230100203137535),
                       ((12, u'ND'), -9.687170853837522),
                       ((5, u'MO'), 18.73167803079034),
                       ((12, u'NH'), -3.329505034062821)])

期望的输出

Data.collect()
[[5, u'MO', 18.73167803079034], [10, u'NM', 14.230100203137535], [12, u'IL', -1.4944293272864724]]

或者

Data.collect()
[u'MO', u'NM', u'IL']

标签: pythonapache-sparkpyspark

解决方案


对于 RDD,你有专门的操作员可以做到这一点,为了在不丢失 RDD 内容的情况下实现你想要的,你可以像这样继续:

Sorted = Data.sortBy(lambda x: x[1],ascending= False)
Mapped = Sorted.map(lambda x : x[0][1])
Mapped.collect()

上述指令序列的输出将是:

['MO', 'NM', 'IL', 'NH', 'ND']

您可以使用第二条指令(地图运算符),但是您想检索任何元素,而不仅仅是您提到的标签。

如果您只想要前三个元素,而不是最后一条指令,您可以使用:

Mapped.take(3)

输出将是:

['MO', 'NM', 'IL']

推荐阅读