3

在花了很多时间弄清楚为什么我收到以下错误之后

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 文件。

4

1 回答 1

1

Row如果您提供关键字参数,则构造函数会对键进行排序。看看这里的源代码。当我发现这一点时,我最终schema在将其应用于数据框之前对其进行了相应的排序:

   sorted_fields = sorted(dfSchema.fields, key=lambda x: x.name)
   sorted_schema = StructType(fields=sorted_fields)
   df = sqlContext.createDataFrame(rddRows, sorted_schema)
于 2015-11-10T18:23:54.777 回答