Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从PySpark中单个元素的RDD创建一对RDD?_Python_Apache Spark_Pyspark_Rdd - Fatal编程技术网

Python 如何从PySpark中单个元素的RDD创建一对RDD?

Python 如何从PySpark中单个元素的RDD创建一对RDD?,python,apache-spark,pyspark,rdd,Python,Apache Spark,Pyspark,Rdd,这是实际的管道。我正在将文本加载到RDD。然后我把它清理干净 rdd1 = sc.textFile("sometext.txt") import re import string def Func(lines): lines = lines.lower() #make all text lowercase lines = re.sub('[%s]' % re.escape(string.punctuation), '', lines) #remove punctuation

这是实际的管道。我正在将文本加载到RDD。然后我把它清理干净

rdd1 = sc.textFile("sometext.txt")

import re
import string

def Func(lines):
    lines = lines.lower() #make all text lowercase
    lines = re.sub('[%s]' % re.escape(string.punctuation), '', lines) #remove punctuation
    lines = re.sub('\w*\d\w*', '', lines) #remove numeric-containing strings
    lines = lines.split() #split lines
    return lines
rdd2 = rdd1.flatMap(Func)

stopwords = ['list of stopwords goes here'] 
rdd3 = rdd2.filter(lambda x: x not in stopwords) # filter out stopwords
rdd3.take(5) #resulting RDD

Out:['a',
     'b',
     'c',
     'd',
     'e']
我现在需要做的是一个马尔可夫链函数的开始。我想将每个元素与其连续元素配对,例如:


[(‘a’、‘b’、(‘b’、‘c’、(‘c’、‘d’、(‘d’、‘e’)等…)

。可以进行更多的优化

>>> rdd=sc.parallelize(['a','b','c','d','e','f'])
#zipping with Index to rip off odd and even elements, to group consecutive elements in future
>>> rdd_odd=rdd.zipWithIndex().filter(lambda (x,y):y%2!=0).map(lambda (x,y):x).coalesce(1)
>>> rdd_even=rdd.zipWithIndex().filter(lambda (x,y):y%2==0).map(lambda (x,y):x).coalesce(1)
>>> rdd_2=rdd_even.zip(rdd_odd)
>>> rdd_2.collect()
[('a', 'b'), ('c', 'd'), ('e', 'f')]

确保
rdd_1
中有偶数个元素。这实际上将构成连续元素配对的基础。

我认为您需要指定RDD中元素的顺序,以确定如何将两个元素视为彼此“连续”。因为RDD可以由多个分区组成,所以spark不知道分区_1中的一个元素是否与分区_2中的另一个元素连续

如果您提前很好地了解数据,您可以定义键以及两个元素如何“连续”。给出了从列表创建rdd的示例,您可以使用索引作为键并进行连接

"""you want to shift arr by 1 to the left, then join back to arr. Calculation based on index"""

arr = ['a','b','c','d','e','f']
rdd = sc.parallelize(arr, 2).zipWithIndex().cache() #cache if rdd is small 

original_rdd = rdd.map(lambda x: (x[1], x[0])) #create rdd with key=index, value=item in list

shifted_rdd = rdd.map(lambda x: (x[1]-1, x[0]))

results = original_rdd.join(shifted_rdd)
print(results.values().collect())

为了在
join
中获得更好的性能,您可以为
original\u rdd
shifted\u rdd
使用范围分区

谢谢@dtth。如果我是用Python做的,我会制作一个迭代函数,将列表中的每个元素与它后面的元素(x[n],x[n+1])耦合起来。但是我不能在RDD上执行这样的迭代操作。你说的“不能执行迭代操作”是什么意思?我真的不明白。你们能澄清一下吗?我的意思是我试过并得到了一个回溯,说RDD对象不是迭代的。我可以再次尝试粘贴准确的错误消息。也许我可以将每个元素的键值对作为键,并将其后面的元素作为值?我编辑了我的问题以显示实际的管道。当我使用该流程时,您建议我出现以下错误:“TypeError:'PipelinedRDD'对象不可编辑”谢谢@Jim Todd。我实际上需要每个元素都有一个连续的元素。意思是,我需要[('a','b'),('b','c'),('c','d'),('d','e'),('e','f'),…]