ошибка pyspark: недостаточно значений для распаковки (ожидалось 3, получено 2)

У меня есть следующие данные

my_data=["Sentence1",['a','b','c'],"Sentence2",['d','e'],"Sentence3",['f']]

и хотите преобразовать входные данные в фрейм данных, используя pyspark 2.2 как

---------------------------------
| ID | Sentence  | label        |
---------------------------------
| 01 | Sentence1 |['a','b','c'] |
| 02 | Sentence2 |['d','e']     |

Но когда сделать это со следующим кодом

from pyspark.sql import Row
to_row = Row('ID','Sentence', 'list')
df = spark.createDataFrame([to_row(i,s,l) for i,s,l in enumerate(my_data)])

Я получаю следующую ошибку

ValueError: недостаточно значений для распаковки (ожидалось 3, получено 2)

Кто-нибудь может мне помочь?


person user9226665    schedule 11.02.2018    source источник


Ответы (1)


Похоже, вы скопировали и вставили код, который не понимаете, поэтому:

  • enumerate:

    возвращает пары, содержащие количество (от начала, которое по умолчанию равно нулю) и значение, получаемое итерируемым аргументом. enumerate полезен для получения индексированного списка:

    (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
    

    С mydata получится

    [(0, 'Sentence1'),
     (1, ['a', 'b', 'c']),
     (2, 'Sentence2'),
     (3, ['d', 'e']),
     (4, 'Sentence3'),
     (5, ['f'])]
    

    что совсем не полезно.

  • Это потому, что ваши данные не должны быть

    ["Sentence1",['a','b','c'],"Sentence2",['d','e'],"Sentence3",['f']]
    

    но

    [("Sentence1",['a','b','c']),("Sentence2",['d','e']),("Sentence3",['f'])]
    

    если вы хотите соединить записи.

  • Если бы он был в таком виде, распаковка с

    i,s,l 
    

    не будет работать, потому что шаблон не соответствует данным. Соответствующий шаблон будет

    i, (s, l)
    
  • Комбинированный:

    from itertools import islice
    
    spark.createDataFrame([(x, y, z) for x, (y, z) in enumerate(zip(
        islice(my_data, 0, len(my_data), 2),
        islice(my_data, 1, len(my_data), 2)))
    ], ("id", "sentence", "label"))
    

    куда

    islice(my_data, m, len(my_data), n)
    

    берет каждый n-й элемент из списка, начиная с m-го, и zip(seq1, seq2) объединяет последовательности в:

    [(seq1[0], seq2[0]), (seq1[1], seq2[1]), ... ]
    

    и enumerate преобразует его в

    [(0, (seq1[0], seq2[0])), (1, (seq1[1], seq2[1])), ... ]
    

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

person Alper t. Turker    schedule 11.02.2018