Python 不易损坏类型:';列表';在加入PySpark RDDs时

Python 不易损坏类型:';列表';在加入PySpark RDDs时,python,apache-spark,hash,pyspark,rdd,Python,Apache Spark,Hash,Pyspark,Rdd,在pipelineRDD上运行collect时出错。我也查过了 我有两个输入文件需要在spark中运行join 文件的格式如下: able,991 大约11岁 汉堡,15 男演员,22岁 [cloudera@quickstart~]$hdfs-dfs-cat/user/cloudera/input/join1\u FileB.txt n-01,5 02年2月3日左右 03年3月8日左右 2004年4月13日 2月22日演员,3 2月23日汉堡,5日 2008年3月2日汉堡 12月15日,100

在pipelineRDD上运行collect时出错。我也查过了 我有两个输入文件需要在spark中运行join

文件的格式如下:

able,991
大约11岁
汉堡,15
男演员,22岁
[cloudera@quickstart~]$hdfs-dfs-cat/user/cloudera/input/join1\u FileB.txt
n-01,5
02年2月3日左右
03年3月8日左右
2004年4月13日
2月22日演员,3
2月23日汉堡,5日
2008年3月2日汉堡
12月15日,100
我还为
fileA
fileB
创建了映射程序,并验证了结果

def split_fileB(line):
    key_val1 = line.split(",")
    dt_word  = key_val1[0].split(" ")
    count    = key_val1[1]
    date     = dt_word[0]
    word     = dt_word[1]
    return(word,date + " " + count)

def split_fileA(line):
    key_val = line.split(",")
    word = key_val[0].split(" ")
    count = int(key_val[1])
    return(word,count)

fileA_data = fileA.map(split_fileA)
fileA_data.collect()
## [(u'able', 991), (u'about', 11), (u'burger', 15), (u'actor', 22)] 

fileB_data = fileA.map(split_fileB)
fileB_data.collect()
## [(u'able', u'n-01 5'),
## (u'about', u'Feb-02 3'),
## (u'about', u'Mar-03 8'),
## (u'able', u'Apr-04 13'),
## (u'actor', u'Feb-22 3'),
## (u'burger', u'Feb-23 5'),
## (u'burger', u'Mar-08 2'),
## (u'able', u'Dec-15 100')]

fileB_joined_fileA = fileB_data.join(fileA_data)
fileB_joined_fileA.collect()


fileB_joined_fileA.collect()
回溯:

16/02/17 03:20:01信息计划程序。DAGScheduler:作业14失败:收集时间:1,耗时0.318953秒
---------------------------------------------------------------------------
Py4JJavaError回溯(最近一次调用)
在()
---->1文件b_加入文件a.collect()
/collect中的usr/lib/spark/python/pyspark/rdd.py(self)
699         """
700,使用SCCallSiteSync(self.context)作为css:
-->701 bytesInJava=self.\u jrdd.collect().iterator()
702返回列表(self.\u collect\u迭代器通过文件(bytesInJava))
703
/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py in____调用(self,*args)
536 answer=self.gateway\u client.send\u命令(command)
537返回值=获取返回值(应答,self.gateway\u客户端,
-->538 self.target_id,self.name)
539
540对于临时参数中的临时参数:
/获取返回值中的usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py(答案、网关客户端、目标id、名称)
298 raise Py4JJavaError(
299'调用{0}{1}{2}时出错。\n'。
-->300格式(目标id,,,,名称),值)
301其他:
302升起Py4JError(
Py4JJavaError:调用o319.collect时出错。
:org.apache.spark.sparkeexception:作业因阶段失败而中止:阶段17.0中的任务1失败1次,最近的失败:阶段17.0中的任务1.0丢失(TID 18,localhost):org.apache.spark.api.python.python异常:回溯(最近一次调用):
文件“/usr/lib/spark/python/pyspark/worker.py”,第101行,在main中
过程()
文件“/usr/lib/spark/python/pyspark/worker.py”,第96行,正在处理中
serializer.dump_流(func(拆分索引,迭代器),outfile)
文件“/usr/lib/spark/python/pyspark/rdd.py”,第2253行,在pipeline_func中
返回函数(拆分,上一个函数(拆分,迭代器))
文件“/usr/lib/spark/python/pyspark/rdd.py”,第270行,func格式
返回f(迭代器)
文件“/usr/lib/spark/python/pyspark/rdd.py”,第1706行,组合形式
merge.mergeValues(迭代器)
文件“/usr/lib/spark/python/pyspark/shuffle.py”,第253行,合并值
d[k]=comb(d[k],v)如果k在d中,则为其他创建者(v)
TypeError:不可损坏的类型:“列表”

首先,您提供的输出与您的代码不匹配。
split\u fileA
First将输入字符串拆分为逗号:

key_val = line.split(",")
然后空格上的
key\u val
的第一个元素:

word = key_val[0].split(" ")
这意味着,假设没有格式错误的行,
word
实际上是一个
列表
,而不是
字符串

"able,991".split(",")[0].split(" ")
## ['able']
因此,
join
转换毫无意义,无法工作,因为列表不可散列

另见