次のエラーが発生する理由を理解するのに多くの時間を費やした後
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 ファイルです。