考慮される方法(_Spark 2.2.1
_):
DataFrame.repartition
_(_partitionExprs: Column*
_パラメーターを使用する2つの実装)DataFrameWriter.partitionBy
_から docs of partitionBy
:
指定した場合、出力は
Hive
のパーティションスキームと同様にファイルシステムにレイアウトされます。例として、Dataset
を年、次に月で分割すると、ディレクトリレイアウトは次のようになります。
- 年= 2016 /月= 1 /
- 年= 2016 /月= 02 /
このことから、列引数の順序がディレクトリレイアウトを決定すると推測します。したがって、それは関連です。
から docs of repartition
:
パーティションの数として_
spark.sql.shuffle.partitions
_を使用して、指定されたパーティション式でパーティション化された新しいDataset
を返します。結果のDataset
はハッシュパーティションです。
私の現在の理解によると、repartition
は、DataFrame
を処理する際の並列度を決定します。この定義では、repartition(numPartitions: Int)
の動作は単純ですが、_partitionExprs: Column*
_引数をとるrepartition
の他の2つの実装については同じことが言えません。
すべてのことを言って、私の疑問は次のとおりです:
partitionBy
メソッドと同様に、列の順序入力もrepartition
メソッドに関連していますか?GROUP BY
_を使用してSQL
クエリを実行しましたか?repartition(columnExprs: Column*)
メソッドの動作を説明してくださいrepartition
の3番目の実装で_numPartitions: Int
_引数と_partitionExprs: Column*
_引数の両方を持つことの関連性は何ですか?これら2つの方法の唯一の類似点は、それらの名前です。さまざまな用途に使用され、さまざまなメカニズムがあるため、それらをまったく比較しないでください。
そうは言っても、repartition
は以下を使用してデータをシャッフルします。
partitionExprs
では、_spark.sql.shuffle.partitions
_を使用する式で使用される列にハッシュパーティショナーを使用します。partitionExprs
とnumPartitions
を使用すると、前のものと同じように動作しますが、_spark.sql.shuffle.partitions
_をオーバーライドします。numPartitions
を使用すると、RoundRobinPartitioning
を使用してデータを再配置するだけです。再パーティション化方法にも関連する列入力の順序は?
です。 hash((x, y))
は一般にhash((y, x))
と同じではありません。
_df = (spark.range(5, numPartitions=4).toDF("x")
.selectExpr("cast(x as string)")
.crossJoin(spark.range(5, numPartitions=4).toDF("y")))
df.repartition(4, "y", "x").rdd.glom().map(len).collect()
_
_[8, 6, 9, 2]
_
_df.repartition(4, "x", "y").rdd.glom().map(len).collect()
_
_[6, 4, 3, 12]
_
並列実行のために抽出された各チャンクには、同じ列でGROUP BYを使用してSQLクエリを実行した場合と同じデータが各グループに含まれていますか?
正確な質問が何であるかに応じて。
GROUP BY
_は、パーティション間で同じ論理的なキーの分散になります。GROUP BY
_は実際のグループのみを「見る」。