3

次のエラーが発生する理由を理解するのに多くの時間を費やした後

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

行とスキーマに基づいてデータフレームを作成しようとしているときに、次のことに気付きました。

次のように見えるrrdRowsと呼ばれる私のrdd内の行で:

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 の名前と行フィールドの名前を一致させないため、上記のエラーが発生します。

つまり、上記の例で、spark が次のようなデータフレームを作成しようとしていることに気付きました (typeError が存在しない場合。ex すべてが 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 に答える