【问题标题】:Create dataframe from list in pyspark: ValueError从 pyspark 中的列表创建数据框:ValueError
【发布时间】:2022-01-03 03:10:26
【问题描述】:

我正在尝试将列表转换为 pyspark 中的数据框,以便我可以将其作为列加入更大的数据框。列表中的数据是随机生成的名称,如下所示:

from faker import Faker
from pyspark.sql.functions import *
import pyspark.sql.functions as F
from pyspark.sql.types import *

faker = Faker("en_GB")

list1 = [faker.first_name() for _ in range(0, 100)]
firstname = sc.parallelize([list1])

schema = StructType([
    StructField('FirstName', StringType(), True)
])

df = spark.createDataFrame(firstname, schema)

display(df)

但是我收到了这个错误:

PythonException: 'ValueError: 对象长度 (100) 与字段长度 (1) 不匹配'。

任何有关导致此问题的原因以及如何解决此问题的想法都非常感谢!

非常感谢,

卡罗来纳

【问题讨论】:

    标签: python dataframe apache-spark pyspark


    【解决方案1】:

    您得到一个ValueError,因为您将一个包含一个元素的列表传递给parallelize,而不是传递一个包含100 个元素的列表,每个元素都包含一个名称的列表。

    如果例如Faker.first_name() 返回'John',然后是'Henry',然后是'Jade',等等...,您的[list1] 参数包含[['John', 'Henry', 'Jade', ...]]

    当您将此类列表传递给createDataFrame 方法时,它会尝试创建一个数据框,其中一行包含 100 列。由于您的架构仅定义一列,因此它失败了。

    这里的解决方案是直接从list1 创建数据框,如PApostol's answer 中一样,或者更改构建list1 的方式,这样您就有一个包含一个名称的100 个列表的列表,而不是一个列表的列表100 个名字:

    from faker import Faker
    from pyspark.sql.functions import *
    import pyspark.sql.functions as F
    from pyspark.sql.types import *
    
    faker = Faker("en_GB")
    
    list1 = [[faker.first_name()] for _ in range(0, 100)]
    firstname = sc.parallelize(list1)
    
    schema = StructType([
        StructField('FirstName', StringType(), True)
    ])
    
    df = spark.createDataFrame(firstname, schema)
    
    display(df)
    

    【讨论】:

    • 这很好用而且很有意义!谢谢! :)
    【解决方案2】:

    这可能是因为pyspark 尝试创建一个包含 100 列(firstname 的长度)的数据框,但您只在 schema 中提供了一列。尝试不并行化:

    list1 = [faker.first_name() for _ in range(0, 100)]
    df = spark.createDataFrame(list1, schema)
    

    或者如果您确实想并行化,请尝试:

    from pyspark.sql import Row
    
    list1 = [faker.first_name() for _ in range(0, 100)]
    firstname = sc.parallelize([list1])
    
    firstname_row = firstname.map(lambda x: Row(x))
    df = spark.createDataFrame(firstname_row, schema)
    

    【讨论】:

    • 您好,感谢您的回复!这可行,但我最终将所有值放在一行中。我希望 100 个值中的每一个都分布在 100 行中。关于如何实现这一目标的任何想法?谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多