创建数据框时出现Pyspark错误:“ StructField”对象没有属性“ encode”

时间:2019-04-23 15:01:10

标签: 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'

我的代码没有发现任何问题(这很简单,我觉得自己很傻)。但是我无法使它正常工作。你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您已经到了那里!

调用createDataFrame specifying a schema时,架构必须为StructType。普通列表是不够的。

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

此外,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)
    ])
)