来自 RDD 的每个键的 PySpark 不同列表

Posted

技术标签:

【中文标题】来自 RDD 的每个键的 PySpark 不同列表【英文标题】:PySpark Distinct List of Each of the Keys from an RDD 【发布时间】:2017-08-15 21:05:38 【问题描述】:

我确信这很简单,但我一直遇到问题。我有一个带有键值对的 RDD。我想要一个仅包含键的不同列表。我将分享代码和示例。提前谢谢!

RDD 示例

>>> rdd4.take(3)
[[(u'11394071', 1), (u'11052103', 1), (u'11052101', 1)], [(u'11847272', 10), (u'999999', 1), (u'11847272', 10)], [(u'af1lowprm1704', 5), (u'am1prm17', 2), (u'af1highprm1704', 2)]]

试过/没用

rdd4.distinct().keys()
rdd4.map(lambda x: tuple(sorted(x))).keys().distinct()

[(u'10972402', 1), (u'10716707', 1), (u'11165362', 1)]

首选结构

[u'11394071', u'11052101', '999999', u'11847272', u'am1prm17', u'af1highprm1704']

【问题讨论】:

11052103u'af1lowprm1704 键呢? 【参考方案1】:

你可以例如:

rdd.flatMap(lambda x: x).keys().distinct()

【讨论】:

效果很好,谢谢!使用平面地图很有意义。【参考方案2】:

您可以使用flatMap 从内部元组中获取键,然后在结果RDD 上调用distinct

rdd = sc.parallelize([[(u'11394071', 1), (u'11052103', 1), (u'11052101', 1)], [(u'11847272', 10), (u'999999', 1), (u'11847272', 10)], [(u'af1lowprm1704', 5), (u'am1prm17', 2), (u'af1highprm1704', 2)]])

rdd.flatMap(lambda x: [k for k, _ in x]).distinct().collect()
# [u'999999', u'11394071', u'11847272', u'af1highprm1704', u'11052101', u'af1lowprm1704', u'am1prm17', u'11052103']

【讨论】:

【参考方案3】:

如果您只想要键列中的不同值,并且您有一个数据框,您可以这样做:

df.select('k').distinct()

如果你只有RDD,你可以这样做

rdd.map(lambda r: r[0]).distinct

假设你的左栏是关键

【讨论】:

以上是关于来自 RDD 的每个键的 PySpark 不同列表的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:来自rdd的包含列表列表的数据框

了解 PySpark 中的 RDD(来自并行化)

为每组 pyspark RDD/dataframe 选择随机列

熊猫数据帧的 PySpark rdd

PySpark 使用函数创建多索引配对 RDD

pyspark:获取列表值的不同元素