花了很多时间搞清楚为什么会出现以下错误
pyspark: TypeError: IntegerType can not accept object in type <type 'unicode'>
在尝试基于Rows和Schema创建数据框时,我注意到以下内容:
我的rdd中的一行称为rrdRows,如下所示:
Row(a="1", b="2", c=3)
我的dfSchema定义为:
dfSchema = StructType([
StructField("c", IntegerType(), True),
StructField("a", StringType(), True),
StructField("b", StringType(), True)
])
按如下方式创建数据框:
df = sqlContext.createDataFrame(rddRows, dfSchema)
带来上面提到的错误,因为Spark只考虑架构中StructFields的顺序,并且不会将StructFields的名称与Row字段的名称相匹配。
换句话说,在上面的例子中,我注意到spark试图创建一个看起来如下的数据帧(如果不存在typeError.e.x,如果所有内容都是String类型的话)
+---+---+---+
| c | b | a |
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
这是真的预期,还是某种错误?
编辑:rddRows是沿着这些行创建的:
def createRows(dic):
res = Row(a=dic["a"],b=dic["b"],c=int(dic["c"])
return res
rddRows = rddDict.map(createRows)
其中rddDict是解析的JSON文件。
答案 0 :(得分:1)
如果您提供关键字参数,Row
的构造函数会对键进行排序。看一下源代码here。当我发现这一点时,我最终对schema
进行了相应的排序,然后将其应用到数据框中:
sorted_fields = sorted(dfSchema.fields, key=lambda x: x.name)
sorted_schema = StructType(fields=sorted_fields)
df = sqlContext.createDataFrame(rddRows, sorted_schema)