У меня есть следующие данные
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)
Кто-нибудь может мне помочь?
Ответ 1 · рейтинг 2 · Alper t. Turker
Похоже, вы скопировали и вставили код, который не понимаете, поэтому:
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])), ... ]
Пожалуйста, подумайте об изучении языка, прежде чем переходить на более продвинутые инструменты.