2

私はspark 2.0を使って寄木細工のファイルからデータを読んでいます。

 val Df = sqlContext.read.parquet("c:/data/parquet1")
 val dfSelect= Df.
      select(
        "id",
        "Currency",
        "balance"

      )



val dfSumForeachId=dfSelect.groupBy("id").sum("balance")
val total=dfSumForeachId.agg(sum("sum(balance)")).first().getDouble(0)

合計残高値を取得するには、これがデータフレームでアクション first() を使用して取得する最良の方法ですか?

Spark 2.0 では groupby key を使用しても問題ありませんか、rdd の groupbykey のような同じパフォーマンスの問題がありますか?ネットワーク経由でデータ全体をシャッフルしてから集計を実行する必要がありますか、または以前のバージョンの reducebykey のように集計がローカルで実行されますか?スパーク

ありがとう

4

1 に答える 1

3

first を使用してデータを取得することは、データを取得するための完全に有効な方法です。つまり、次のことを行います。

val total = dfSelect.agg(sum("balance")).first().getDouble(0)

おそらく、合計を取得するためのパフォーマンスが向上します。

group by key と reduce by key は、同じ理由で以前のバージョンとまったく同じように機能します。group by key は、実行したいアクションを想定していないため、reduce by key のように部分的な集計を行う方法を知ることができません。

dataframe groupby と sum を実行すると、実際には + オプションを使用してキーごとに削減を行っており、2 番目に行った集計は + を使用した削減です。つまり、データフレームはより効率的にそれを行います。これは、何が行われたかを正確に把握しているため、ステージ全体のコード生成などの多くの最適化を実行できるためです。

于 2017-01-03T11:07:16.893 に答える