Pyspark: может нарезать список, но не может индексировать - PullRequest
0 голосов
/ 24 мая 2018

Это в pyspark, где r_parsed - это СДР,

 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: задание прервано из-за сбоя этапа: задание 1 на этапе 120.0 не выполнено 1 раз, последний сбой: потерянное задание 1.0 на этапе 120.0 (TID 241, localhost, драйвер исполнителя): org.apache.spark.api.python.PythonException: трассировка (последний вызов был последним): файл "/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", строка372, в dump_stream vs = list (itertools.islice (iterator, batch)) Файл "", строка 5, в IndexError: индекс списка вне диапазона

Что это за колдовство?Почему я могу отобразить фрагмент списка, но не индекс списка?

1 Ответ

0 голосов
/ 24 мая 2018

Это связано с тем, что синтаксис среза может обрабатывать случай, когда длина списка меньше длины среза.

Например:

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)
...