2016-10-31 6 views
-2

CSVファイルを読み込み、特定のフィールドの一意の値の出現をカウントするspark dataset apisを試行します。私が考えるべきアプローチの1つは、期待どおりに動作していないということです。何が見落とされているのか教えてください。私は以下のようなバグのあるアプローチと同様に、両方のバグを報告しています。spark dataset:列から一意の値の出現回数を取得する方法

// get all records from a column 
val professionColumn = data.select("profession") 

// breakdown by professions in descending order 
// ***** DOES NOT WORKS ***** // 
val breakdownByProfession = professionColumn.groupBy().count().collect() 

// ***** WORKS ***** // 
val breakdownByProfessiond = data.groupBy("profession").count().sort("count") // WORKS 

println (s"\n\nbreakdown by profession \n") 
breakdownByProfession.show() 

さらに効率的な方法を教えてください。私の推測は最初のもの(最初にそれを試みる理由) また、そのような操作の出力をデータセットAPIを使用してテキストファイルに保存する最良の方法は何ですか?

答えて

1

最初のケースでは、グループ化列が指定されていない場合、データセット全体が1つのグループと見なされます。この動作は、データセットに列が1つしか存在しない場合でも保持されます。したがって、列のリストを常にgroupBy()に渡す必要があります。

ここでは、data.select("profession").groupBy("profession").countdata.groupBy("profession").countの2つのオプションがあります。ほとんどの場合、これらの2つの選択肢の性能は、Sparkが投影(すなわち、列選択)をできるだけ操作者に押さえようとするので全く同じになる。したがって、data.groupBy("profession").countの場合でも、Sparkはグループ化する前に最初にprofession列を選択します。 GROUPBY変換で

+0

おかげで以下のように列名を提供する必要があります - あなたは、実行計画を見て、これを確認することができます列名を指定している間にデータセット全体に対して操作を行うのと比べて、パフォーマンスが向上しませんか? – coredump

+0

この場合、最初に選択するとパフォーマンスは向上しません。これは、 'select'が' groupby'の下にプッシュされるためです。 – ShirishT

+0

あなたは、両方の選択肢、つまり 'data.select("職業 ")。groupBy("職業 ")。countplain'と' data.groupBy( "職業")の両方の説明計画を見ることができます。説明する。どちらの場合も、選択が最初に行われ、次にグループ化されることに注意してください。 – ShirishT

0

org.apache.spark.sql.Dataset.explain()は、あなたが選択し、作成することにより、場合非常に詳細な説明については、これを確認してください

val breakdownByProfession = professionColumn.groupBy().count().collect() 
+0

したがって、RDDに1つの列が含まれていても、groupby関数でその列を指定する必要がありますか?私はあなたが 'professionColumn.groupBy("職業 ")を意味すると仮定します。count()。collect()' – coredump

関連する問題