来自Row with Schema的sqlContext.createDataframe。 pyspark:TypeError:IntegerType不能接受类型<type'unicode'=“”>中的对象

时间:2015-11-03 13:16:36

标签: unicode apache-spark apache-spark-sql pyspark spark-dataframe

花了很多时间搞清楚为什么会出现以下错误

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

1 个答案:

答案 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)