PySpark:TypeError:StructType 不能接受类型为 <type 'unicode'> 或 <type 'str'> 的对象

Posted

技术标签:

【中文标题】PySpark:TypeError:StructType 不能接受类型为 <type \'unicode\'> 或 <type \'str\'> 的对象【英文标题】:PySpark: TypeError: StructType can not accept object in type <type 'unicode'> or <type 'str'>PySpark:TypeError:StructType 不能接受类型为 <type 'unicode'> 或 <type 'str'> 的对象 【发布时间】:2017-12-07 16:50:37 【问题描述】:

我正在从 CSV 文件中读取数据,然后创建一个 DataFrame。但是当我尝试访问 DataFrame 中的数据时,我得到了 TypeError。

fields = [StructField(field_name, StringType(), True) for field_name in schema.split(',')]
schema = StructType(fields)

input_dataframe = sql_context.createDataFrame(input_data_1, schema)

print input_dataframe.filter(input_dataframe.diagnosis_code == '11').count()

“unicode”和“str”都不适用于 Spark DataFrame。我得到以下类型错误:

TypeError: StructType 不能接受类型中的对象 TypeError: StructType 不能接受类型中的对象

我尝试在 'utf-8' 中进行如下编码,但仍然出现错误,但现在抱怨 TypeError with 'str':

input_data_2 = input_data_1.map(lambda x: x.encode("utf-8"))
input_dataframe = sql_context.createDataFrame(input_data_2, schema)

print input_dataframe.filter(input_dataframe.diagnosis_code == '410.11').count()

我还尝试使用参数 use_unicode=True/False 将 CSV 直接解析为 utf-8 或 unicode

【问题讨论】:

【参考方案1】:

字里行间的阅读。你是

从 CSV 文件中读取数据

得到

TypeError: StructType can not accept object in type <type 'unicode'>

发生这种情况是因为您传递的字符串不是与结构兼容的对象。可能您传递的数据如下:

input_data_1 = sc.parallelize(["1,foo,2", "2,bar,3"])

和架构

schema = "x,y,z"

fields = [StructField(field_name, StringType(), True) for field_name in schema.split(',')]
schema = StructType(fields)

您希望 Spark 能够解决问题。但它不是那样工作的。你可以

input_dataframe = sqlContext.createDataFrame(input_data_1.map(lambda s: s.split(",")), schema)

但老实说只是使用 Spark csv 阅读器:

spark.read.schema(schema).csv("/path/to/file")

【讨论】:

当我尝试spark.read.schema 时,我得到了pyspark.sql.utils.IllegalArgumentException: 'Unsupported class file major version 55'。我正在从一个目录中读取数据,在该目录中,我使用多个 gzip 压缩的 .csv 文件对数据进行了分区

以上是关于PySpark:TypeError:StructType 不能接受类型为 <type 'unicode'> 或 <type 'str'> 的对象的主要内容,如果未能解决你的问题,请参考以下文章

# 字符串方法 TypeError: 列在 pyspark 中不可迭代

PySpark:TypeError:“行”对象不支持项目分配

PySpark:TypeError:条件应该是字符串或列

如何根据 PySpark 中窗口聚合的条件计算不同值?

Pyspark UDF - TypeError:“模块”对象不可调用

Pyspark 错误:TypeError:不能将类型 <type 'NoneType'> 视为向量 [重复]