首页 文章

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

提问于
浏览
1

这在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, Actuator 驱动程序):org.apache.spark .api.python.PythonException:Traceback(最近一次调用最后一次):文件“/home/filipe/anaconda3/lib/python3.5/site-packages/pyspark/python/lib/pyspark.zip/pyspark/worker.py” ,第229行,在主进程()文件“/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”,line 372,在dump_stream vs = list(itertools.islice(iterator,batch))文件“”,第5行,在IndexError中:列表索引超出范围

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

1 回答

  • 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])
    

    或者将逻辑构建到map函数中:

    r_parsed = r_parsed.map(lambda x: x.keys()[1] if len(x.keys()) > 1 else None)
    

相关问题