这在pyspark中,其中r_parsed是RDD,
r_parsed = r_parsed.map(lambda x: ([k for k in x.keys()][:3]))
x = r_parsed.collect()[666]
print(x)
['is_quote_status', 'place', 'in_reply_to_user_id']
但是......
r_parsed = r_parsed.map(lambda x: ([k for k in x.keys()][1]))
x = r_parsed.collect()[666]
Py4JJavaError:调用时发生错误 Z:org.apache.spark.api.python.PythonRDD.collectAndServe。 : org.apache.spark.SparkException:作业因阶段失败而中止: 阶段120.0中的任务1失败1次,最近失败:丢失任务 阶段120.0中的1.0(TID 241,localhost,执行程序驱动程序):org.apache.spark.api.python.PythonException:Traceback(最新版本) 最后打电话):文件 “/home/filipe/anaconda3/lib/python3.5/site-packages/pyspark/python/lib/pyspark.zip/pyspark/worker.py” 第229行,主要 process()文件“/home/filipe/anaconda3/lib/python3.5/site-packages/pyspark/python/lib/pyspark.zip/pyspark/worker.py”, 第224行,正在处理中 serializer.dump_stream(func(split_index,iterator),outfile)文件 “/home/filipe/anaconda3/lib/python3.5/site-packages/pyspark/python/lib/pyspark.zip/pyspark/serializers.py” 第372行,在dump_stream中 vs = list(itertools.islice(iterator,batch))IndexError中的文件“”,第5行: 列表索引超出范围
这是什么巫术?为什么我可以映射列表切片,而不是列表索引?
答案 0 :(得分:0)
这是因为切片语法可以处理列表长度小于切片长度的情况。
例如:
my_list = [1]
print(my_list[:3])
#[1]
然而,索引不是宽容的:
print(my_list[1])
IndexErrorTraceback (most recent call last)
<ipython-input-2-f6bea31a1a9e> in <module>()
----> 1 print(my_list[1])
IndexError: list index out of range
在rdd
的某处,您有一行,其中键的长度小于2.
您可能需要先过滤:
r_parsed = r_parsed.filter(lambda x: len(x.keys()) > 1).map(lambda x: x.keys()[1])
或者将逻辑构建到地图功能中:
r_parsed = r_parsed.map(lambda x: x.keys()[1] if len(x.keys()) > 1 else None)