如何将rdd-pyspark中的元素从单个元素集开始分组为双元素集

时间:2018-03-24 16:16:08

标签: apache-spark dataframe pyspark rdd

我有一个像下面这样的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传递给函数并通过循环遍历所有元素来返回对吗?

这只是样本数据,实际数据很多,所以我怀疑循环遍历所有元素会是一个好主意! :(

我真的很感激任何帮助或方向。

或者数据框架在处理这些事情方面会更好吗?

1 个答案:

答案 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']