2017-08-11 5 views
0

私はcreateDataFrame機能と定義されてschemaを使用してデータフレームにRDDを変換し、JSONとして結果のデータフレーム保存しようとしています使用してRDDからのデータフレームを作成する問題:Pyspark - 定義されたスキーマ

df_final = sqlContext.createDataFrame(my_rdd, schema) 
df_final.write.json('/tmp/data') 

RDDを

{"obj1": {"name": "ABC", "dateCreatedUtc": "2017-06-23 00:00:00", "pair1": {"lat": 60.82349395751953, "lon": -8.173828125}, "pair2": {"lat": 49.16015625, "lon": 1.867676019668579}}, "obj2": {"name": "DEF", "pair1": {"lat": "0.00", "lon": "0.00"}, "pair2": {"lat": "0.00", "lon": "0.00"}}} 
{"obj1": {"name": "GHI", "dateCreatedUtc": "2017-06-23 00:00:00", "pair1": {"lat": 10.43567890021344, "lon": -17.34675465}, "pair2": {"lat": 80.36473824, "lon": 4.557957859758945}}, "obj2": {"name": "JKL", "pair1": {"lat": "0.00", "lon": "0.00"}, "pair2": {"lat": "0.00", "lon": "0.00"}}} 
... 
... 
... 

次のように私はschemaを定義しようとした:次の行が含まれてい

schema = StructType([ 
    StructField('obj1', MapType(StringType(), MapType(StringType(), StringType(), True), True), True), 
    StructField('obj2', MapType(StringType(), MapType(StringType(), StringType(), True), True), True) 
]) 

コードがうまく動作しますが、私は私の出力JSONファイルをチェックするとき、次のように、行は次のようになります。

{"obj1": {"name": null, "dateCreatedUtc": null, "pair1": {"lat": 60.82349395751953, "lon": -8.173828125}, "pair2": {"lat": 49.16015625, "lon": 1.867676019668579}}, "obj2": {"name": null, "pair1": {"lat": "0.00", "lon": "0.00"}, "pair2": {"lat": "0.00", "lon": "0.00"}}} 
{"obj1": {"name": null, "dateCreatedUtc": null, "pair1": {"lat": 10.43567890021344, "lon": -17.34675465}, "pair2": {"lat": 80.36473824, "lon": 4.557957859758945}}, "obj2": {"name": null, "pair1": {"lat": "0.00", "lon": "0.00"}, "pair2": {"lat": "0.00", "lon": "0.00"}}} 

TL; DRは - 緯度とロンを除くすべてのフィールドは、ヌル値が移入されています。

これは、RDDの行と定義したスキーマとの間のスキーマの不一致を意味することがわかります。しかし、私は入れ子になったjson構造のために料理をしていると思っていたので、私はスキーマの問題を理解することができません。

これに関するヘルプ/参考情報はありがたいです。

ありがとうございます!

答えて

0

MapTypeは、タイプが混在しているデータを表現する方法ではありません。サンプルレコードの正しいスキーマ(これらはPython dictsと仮定します):

StructType([ 
    StructField("obj1", StructType([ 
     StructField("dateCreatedUtc", StringType(), True), 
     StructField("name", StringType(), True), 
     StructField("pair1", StructType([ 
      StructField("lat", DoubleType(), True), 
      StructField("lon", DoubleType(), True) 
     ]), True), 
     StructField("pair2", StructType([ 
      StructField("lat", DoubleType(), True), 
      StructField("lon", DoubleType(), True) 
     ]), True) 
    ]), True), 
    StructField("obj2", StructType([ 
     StructField("name", StringType(), True), 
     StructField("pair1", StructType([ 
      StructField("lat", StringType(), True), 
      StructField("lon", StringType(), True) 
     ]), True), 
     StructField("pair2", StructType([ 
      StructField("lat", StringType(), True), 
      StructField("lon", StringType(), True) 
     ]), True) 
    ]), True) 
]) 
関連する問題