PySpark创建DataFrame报错:StructType无法接受str类型对象'id'
问题解决方向
核心错误原因
直接把单个字典传给spark.createDataFrame(),Spark会把字典的键(比如'id')当成行的元素处理,而非把整个字典作为一行数据,这就导致StructType无法匹配字符串类型的元素,触发报错。
具体修正步骤
- 包装数据为列表:把
account_response['Account']放到列表里,让Spark识别这是一行数据:df = spark.createDataFrame([account_response['Account']], schema=account_schema) - 修正Schema字段名不匹配:原数据里的字段是
accountNumber,你Schema里写的是Account_number,要改成一致:StructField('accountNumber', StringType(), True), - 补充缺失的Schema字段:原数据包含
organizationId和contact字段,你的Schema里没定义,若要完整映射需补充:# 补充organizationId StructField('organizationId', IntegerType(), True), # 补充contact数组类型字段 StructField('contact', ArrayType(StructType([ StructField('id', IntegerType(), True), StructField('name', StringType(), True), StructField('extID', StringType(), True) ])), True), - 可选:调整类型匹配:原数据里
id、organizationId是整数,若不需要转字符串,可把Schema里对应的类型改成IntegerType(),减少不必要的类型转换。
完整修正后的代码示例
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, ArrayType account_schema = StructType([ StructField('id', IntegerType(), True), StructField('externalIdentifier', StringType(), True), StructField('name', StringType(), True), StructField('accountNumber', StringType(), True), StructField('Rep', StructType([ StructField('firstName', StringType(), True), StructField('lastName', StringType(), True), StructField('email', StringType(), True), StructField('id', StringType(), True), ]), True), StructField('organizationId', IntegerType(), True), StructField('streetAddress', StringType(), True), StructField('streetAddressCity', StringType(), True), StructField('streetAddressState', StringType(), True), StructField('streetAddressZipCode', StringType(), True), StructField('contact', ArrayType(StructType([ StructField('id', IntegerType(), True), StructField('name', StringType(), True), StructField('extID', StringType(), True) ])), True) ]) df = spark.createDataFrame([account_response['Account']], schema=account_schema)
内容的提问来源于stack exchange,提问作者Alen Giliana
相关产品推荐
相关产品推荐

