如何从单元素集到双元素集对 rdd-pyspark 中的元素进行分组
Posted
技术标签:
【中文标题】如何从单元素集到双元素集对 rdd-pyspark 中的元素进行分组【英文标题】:How do I group elements in rdd-pyspark starting from single element sets to double elements sets 【发布时间】:2018-03-24 16:16:07 【问题描述】:我有一个像下面这样的rdd['1','5','7','8']
首先我想把它转换成['1 5','1 7', '1 8','5 7','5 8', '7 8'...]
那么['1 5 7', '1 5 8', '1 7 8'...]
在这些步骤之间可能需要额外的步骤,例如删除重复项和其他值 -
喜欢'1 1' or '1 5' and '5 1'
rdd.reduce(lambda x,y: (x+ " " + y)).collect()
返回类似
的东西'1 5 7 8'
如何分解它是我正在努力解决的问题。
或者,我应该在 rdd 上使用 foreach 函数并将元素和 rdd 传递给函数并通过循环遍历所有元素来返回对吗?
这只是示例数据,实际数据很多,所以我怀疑循环遍历所有元素是否是个好主意! :(
非常感谢我应该去的任何帮助或方向。
或者数据框在处理这些事情时会更好吗?
【问题讨论】:
spark 对您的要求没有好处,因为您的要求建议在一个执行程序中收集所有数据并在保留订单的情况下进行处理。简单的 python 代码将比 spark 更快地完成工作 好的,谢谢 Ramesh,我实际上是在尝试在 apache pyspark 中实现 apriori 算法,这是查找候选项目集的步骤。那么,您的建议是使用 python 代码然后使用 spark api 来查找对的这个步骤更好?也许在通过python得到这个['1 5','1 7', '1 8','5 7','5 8', '7 8'...]
之后,我可以切换回spark来做一些处理,比如计算对等。无论如何,spark api只会在某些情况下有所帮助,而不是全部?
【参考方案1】:
您可以使用cartesian
转换来组合值:
rdd = sc.parallelize(['1','5','7','8'])
#Filtered out tuples with same values as you don't have it
# in your example
set2 = rdd.cartesian(rdd).filter(lambda l: l[0] != l[1])
print(set2.map(lambda l: '%s %s' % l).collect());
set3 也可以这样做:
#filtering out tuples of values fewer than 3 distinct
#values using a set...
values3 = rdd.cartesian(set2)\
.filter(lambda l: len(set([l[0], l[1][0], l[1][1]])) == 3 )\
.map(lambda l: '%s %s %s' % (l[0], l[1][0], l[1][1])).collect()
第一个输出是:
['1 5', '1 7', '1 8', '5 1', '5 7', '5 8', '7 1', '7 5', '7 8', '8 1', '8 5', '8 7']
values3
包含:
['1 5 7', '1 5 8', '1 7 5', '1 7 8', '1 8 5', '1 8 7', '5 1 7', '5 1 8',
'5 7 1', '5 7 8', '5 8 1', '5 8 7', '7 1 5', '7 1 8', '7 5 1', '7 5 8',
'7 8 1', '7 8 5', '8 1 5', '8 1 7', '8 5 1', '8 5 7', '8 7 1', '8 7 5']
【讨论】:
谢谢,cartesion 函数似乎为我完成了这项工作! :) 另外,如果可以 - 你能看看这个问题 - ***.com/questions/49468082/… 谢谢!以上是关于如何从单元素集到双元素集对 rdd-pyspark 中的元素进行分组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JQuery 从点击事件中找到最外层元素的 ID?
习题3.13 双端队列(25 分)浙大版《数据结构(第2版)》题目集