Apache spark 如何将rdd pyspark中的元素从单元素集分组到双元素集

Apache spark 如何将rdd pyspark中的元素从单元素集分组到双元素集,apache-spark,dataframe,pyspark,rdd,Apache Spark,Dataframe,Pyspark,Rdd,我有一个rdd,如下所示 ['1','5','7','8'] 首先,我想将其转换为 ['15'、'17'、'18'、'57'、'58'、'78'…] 然后 在这两个步骤之间,如果需要,还可以执行其他步骤,如删除重复项和其他值- 像'11'或'15'和'51' rdd.reduce(λx,y:(x+“”+y)).collect() 返回类似于 '15 7 8' 我如何打破它是我正在努力解决的问题 或者,我应该在rdd上使用foreach函数并将元素和rdd传递给一个函数,然后通过循环所有元素返回

我有一个rdd,如下所示
['1','5','7','8']

首先,我想将其转换为
['15'、'17'、'18'、'57'、'58'、'78'…]

然后

在这两个步骤之间,如果需要,还可以执行其他步骤,如删除重复项和其他值-
'11'或'15'和'51'

rdd.reduce(λx,y:(x+“”+y)).collect()

返回类似于

'15 7 8'

我如何打破它是我正在努力解决的问题

或者,我应该在rdd上使用foreach函数并将元素和rdd传递给一个函数,然后通过循环所有元素返回对吗

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

我将非常感谢您对我的任何帮助或指导


或者data frame在处理这些问题时会更好吗?

您可以使用
笛卡尔变换来组合值:

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']
值3
包含:

['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']

spark对您的需求没有好处,因为您的需求建议在一个执行器中收集所有数据并保留顺序。简单的python代码将比在sparkOK中完成工作快得多感谢Ramesh,我实际上正在尝试在apache PypSpark中实现apriori算法,这是查找候选的步骤因此,您建议的是,查找配对的这一步比使用python代码更好,而不是使用spark api?也许在获得此
['15'、'17'、'18'、'57'、'58'、'78'…]
通过python,我可以切换回spark进行一些处理,如计算成对数等。无论如何,spark api只在某些情况下有用,而不是全部?谢谢,cartesion函数似乎可以帮我完成这项工作!:)此外,如果可以的话-你能看看这个问题吗-谢谢!