pyspark错误:没有足够的值解压缩(预期3,得到2)

时间:2018-02-11 11:57:05

标签: python apache-spark pyspark pyspark-sql

我有以下数据

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

并希望使用pyspark 2.2将输入数据转换为dataframe

---------------------------------
| 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 个答案:

答案 0 :(得分:2)

看起来你复制并粘贴了code you don't understand所以:

  • enumerate

      

    产生包含计数的对(来自     start,默认为零)和iterable参数产生的值。    枚举对于获取索引列表很有用:

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

    从第m个开始从列表中获取每个第n个项目,zip(seq1, seq2)将序列合并到:

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

    enumerate将其转换为

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

在切换到更高级的工具之前,请考虑学习该语言。