创建数据帧时 Pyspark 错误:“StructField”对象没有“编码”属性

Bar*_*nka 5 python pyspark

创建数据框时我遇到了一个小问题:

from pyspark.sql import SparkSession, types

spark = SparkSession.builder.appName('test').getOrCreate()

df_test = spark.createDataFrame(
    ['a string', 1],
    schema = [
        types.StructField('col1', types.StringType(), True),
        types.StructField('col2', types.IntegerType(), True)
    ]
)

## AttributeError: 'StructField' object has no attribute 'encode'
Run Code Online (Sandbox Code Playgroud)

我没有发现我的代码有什么问题(它太简单了,我觉得很愚蠢)。但我无法让它发挥作用。你能为我指出正确的方向吗?

Jes*_*ano 11

你大部分时间都在那里!

当您调用createDataFrame 指定架构时,该架构必须是StructType. 一个普通的列表是不够的。

  1. 从原始 RDD 创建元组或列表的 RDD;
  2. 创建由与步骤 1 中创建的 RDD 中的元组或列表的结构相匹配的模式表示。StructType
  3. 通过 SparkSession 提供的 createDataFrame 方法将模式应用到 RDD。

此外,中的第一个字段createDataFrame是行列表,而不是一行的值列表。所以单个一维列表会导致错误。将其包装在一个字典中,明确标识哪些列保存哪些值是一种解决方案,但可能还有其他解决方案。

结果应该类似于:

df_test = spark.createDataFrame(
    [{'col1': 'a string', 'col2': 1}],
    schema = types.StructType([
        types.StructField('col1', types.StringType(), True),
        types.StructField('col2', types.IntegerType(), True)
    ])
)
Run Code Online (Sandbox Code Playgroud)