在花了很多时间弄清楚为什么我收到以下错误之后
pyspark: TypeError: IntegerType can not accept object in type <type 'unicode'>
在尝试基于行和模式创建数据框时,我注意到以下内容:
在我的 rdd 中有一个名为 rrdRows 的 Row,如下所示:
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)
带来了上面提到的Error,因为Spark只考虑了StructFields在schema中的顺序,并没有将StructFields的名称与Row字段的名称进行匹配。
换句话说,在上面的示例中,我注意到 spark 尝试创建一个如下所示的数据帧(如果不存在 typeError。例如,如果所有内容都是 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 文件。