2016-07-10 15 views
1

Apache Sparkでいくつかの調査をしていて、私は本当に奇妙なものに直面しています。以下のコードを参照してください。RDDをDataFrame PySparkに変換するときにエラーが発生する

ClimateRdd = ClimateRdd.map(lambda x: tuple(x)) 
print ClimateRdd.first() 

これらのコマンドは、私には、この行を返す: ('1743-11-01', '4.3839999999999995', '2.294', '\xc3\x85land')

それから私はこのようなデータフレームにこれを移動します。

schemaDf = sqlContext.createDataFrame(ClimateRdd, schema) 
schemaDf.registerTempTable('globalTemp') 
result = sqlContext.sql("SELECT dt FROM globalTemp") 
result.show(5) 

これは完璧に動作し、私はこれを得ました結果:

+----------+ 
|  dt| 
+----------+ 
|1743-11-01| 
|1743-12-01| 
|1744-01-01| 
|1744-02-01| 
|1744-03-01| 
+----------+ 
only showing top 5 rows 

その結果、およびラインを実行しよう:

dates = result.map(lambda x: "Datas: " + x.dt) 
print dates.collect() 

私はこの原因を使用してJavaの例外が発生しました:Caused by: java.lang.IllegalStateException: Input row doesn't have expected number of values required by the schema. 4 fields are required while 5 values are provided.

は、まあ、私は多くの研究を行なったし、私が問題だったものを見つけ、私は私の最初の変更これにコードの一部:

ClimateRdd = ClimateRdd.map(lambda x: (x[0], x[1], x[2], x[3]))  

それは働いた!

最初の部分がうまくいかなかったのはなぜですか?手動でタプルを生成する必要があるのはなぜですか?このタプルを動的に作成する方法はありますか?

+3

4つ以上の要素を持つ 'ClimateRDD'の行があるようです。 'ClimateRdd.map(lambda x:(1、len(x))。countByValue()'のようなことをしてみてください.5要素の行が見えます。 – santon

+0

4つ以上の行要素がありません。 – KartikKannapur

+0

Humm、それは完全な意味を持っています!私は自分のデータセットをチェックし、すべての答えを与えるでしょう。手動タプルは発生しませんでした。私は異なるタイプのカラムを持っているかどうか分からなかったので、データセットをチェックします。ファイルはCSVのようなものかもしれません。 –

答えて

3

問題は汚れたデータでした。データはデフォルトの分割パラメータにはありませんでした。問題はそこにあった。

タプル変換を行ったとき、その構造にはデータの大部分に応じて4つのフィールドがあるものとします。しかし、ある特定のラインではそれは本当ではありませんでした。

これが私のデータフレームがタプル変換でクラッシュする理由です。

0

これはちょっと変です。 なぜタプルが必要ですか?リストは地図でうまく動作します。

ClimateRdd.map(lambda x: [x[0], x[1], x[2], x[3]])  
+1

リストの作業私が知っていることは、タプルを手動で設定することです。しかし、@サンントンのコメントによると。多分私の問題はRDDのサイズです。 –

関連する問題