创建数据框时我遇到了一个小问题:
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'
我的代码没有发现任何问题(这很简单,我觉得自己很傻)。但是我无法使它正常工作。你能指出我正确的方向吗?
答案 0 :(得分:1)
您已经到了那里!
调用createDataFrame
specifying a schema时,架构必须为StructType
。普通列表是不够的。
- 从原始RDD创建元组或列表的RDD;
- 在步骤1中创建的RDD中,创建与元组或列表的结构相匹配的
StructType
表示的模式。- 通过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)
])
)