Pyspark:可以切片列表,但不能索引

时间:2018-05-24 20:21:21

标签: python list dictionary pyspark rdd

这在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行:   列表索引超出范围

这是什么巫术?为什么我可以映射列表切片,而不是列表索引?

1 个答案:

答案 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)