我有一个像下面这样的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传递给函数并通过循环遍历所有元素来返回对吗?
这只是样本数据,实际数据很多,所以我怀疑循环遍历所有元素会是一个好主意! :(
我真的很感激任何帮助或方向。
或者数据框架在处理这些事情方面会更好吗?
答案 0 :(得分: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']