2017-06-17 7 views
0

Array [Row]の形式のデータフレームの結果をRDD [Row]に変換するシナリオがあります。私は並列化を使用しようとしましたが、生産システムでは実現不可能な単一のシステムにデータ全体を含める必要があるため、使用したくありません。Array [Row]をRDD [Row]に変換するには

val Bid = spark.sql("select Distinct DeviceId, ButtonName from stb").collect() 
val bidrdd = sparkContext.parallelize(Bid) 

どうすればよいですか?私はこのリンク(How to convert DataFrame to RDD in Scala?)で与えられたアプローチを試みたが、それは私のために働かなかった。

val bidrdd1 = Bid.map(x => (x(0).toString, x(1).toString)).rdd 

それはあなたがここで作成した変数BidががDATAFRAME ないエラーにvalue rdd is not a member of Array[(String, String)]

答えて

2

を与え、それはあなたがそれに.rddを使用することはできません理由です、Array[Row]です。あなたがRDD[Row]を取得したい場合は、単に(collectを呼び出さずに)データフレームの.rddを呼び出す:

val rdd = spark.sql("select Distinct DeviceId, ButtonName from stb").rdd 

あなたの投稿は注目に値するいくつかの誤解が含まれています

...であるデータフレームフォーマットアレイ[行] ...

ないかなり - Array[Row]がDataFrからデータを収集の結果ですドライバメモリに保存してください。これはDataFrameではありません。

...私はそれが単一のシステム全体のデータが含まれている必要としてそれを使用したくない...あなたがデータフレームにcollectを使用するや否や

注意、あなたはすでにデータ全体を単一のJVMのメモリに集めています。したがって、parallelizeを使用することは問題ではありません。

+0

ありがとうTzach、それは働いた。現在、私はテストデータに取り組んでいるので、collectを使用しました。最終コードには、結果をフラットファイルに保存することが含まれます。 – ibh

+0

'collect'を使ってテストするのは便利で適切ですが、実際のコードとテストを分けてください。' collect'は 'collect'が呼び出されなかったのと同じように使用できない完全に異なる型を返します。 –