web-dev-qa-db-ja.com

partitionColumn、lowerBound、upperBound、numPartitionsパラメーターの意味は何ですか?

SparkのJDBC接続を介してSQL Serverからデータをフェッチしているときに、partitionColumnlowerBoundupperBound、およびnumPartitionsなどの並列化パラメーターを設定できることがわかりました。 spark documentation を通り抜けましたが、理解できませんでした。

誰でもこれらのパラメーターの意味を説明できますか?

22
Bhanuday Birla

それは単純だ:

  • partitionColumnは、パーティションを決定するために使用される列です。
  • lowerBoundおよびupperBoundは、フェッチする値の範囲を決定します。完全なデータセットは、次のクエリに対応する行を使用します。

    SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound
    
  • numPartitionsは、作成するパーティションの数を決定します。 lowerBoundupperBoundの間の範囲は、それぞれが等しいストライドを持つnumPartitionsに分割されます。

    upperBound / numPartitions - lowerBound / numPartitions
    

    例:

    • lowerBound:0
    • upperBound:1000
    • numPartitions:10

    ストライドは100に等しく、パーティションは次のクエリに対応します。

    • SELECT * FROM table WHERE partitionColumn BETWEEN 0 AND 100
    • SELECT * FROM table WHERE partitionColumn BETWEEN 100 AND 200
    • ...
    • SELECT * FROM table WHERE partitionColumn BETWEEN 900 AND 1000
23
user7280077

実際、上記のリストはいくつかのこと、特に最初と最後のクエリを逃しています。

それらがないと、いくつかのデータ(lowerBoundの前とupperBoundの後のデータ)が失われます。下限が0であるため、この例からは明らかではありません。

完全なリストは次のとおりです。

SELECT * FROM table WHERE partitionColumn < 100

SELECT * FROM table WHERE partitionColumn BETWEEN 0 AND 100  
SELECT * FROM table WHERE partitionColumn BETWEEN 100 AND 200  

...

SELECT * FROM table WHERE partitionColumn > 9000
12
Andrea

パーティションを作成しても、フィルタリングによりデータが失われることはありません。 upperBoundlowerboundとともにnumPartitionsは、パーティションの作成方法を定義するだけです。 upperBoundおよびlowerboundは、取得するpartitionColumnの値の範囲(フィルター)を定義しません。

For a given input of lowerBound (l), upperBound (u) and numPartitions (n) 
The partitions are created as follows:

stride, s= (u-l)/n

**SELECT * FROM table WHERE partitionColumn < l+s or partitionColumn is null**
SELECT * FROM table WHERE partitionColumn >= l+s AND <2s  
SELECT * FROM table WHERE partitionColumn >= l+2s AND <3s
...
**SELECT * FROM table WHERE partitionColumn >= l+(n-1)s**

たとえば、upperBound = 500lowerBound = 0およびnumPartitions = 5。パーティションは次のクエリのとおりです。

SELECT * FROM table WHERE partitionColumn < 100 or partitionColumn is null
SELECT * FROM table WHERE partitionColumn >= 100 AND <200 
SELECT * FROM table WHERE partitionColumn >= 200 AND <300
SELECT * FROM table WHERE partitionColumn >= 300 AND <400
...
SELECT * FROM table WHERE partitionColumn >= 400

partitionColumnの実際の値の範囲に応じて、各パーティションの結果サイズは異なります。

7
PIYUSH PASARI

確認済みの回答に追加したいのは言葉なので、

それらがなければ、いくつかのデータを失うでしょうは誤解を招きます。

ドキュメントから、lowerBoundとupperBoundはパーティションストライドを決定するためだけに使用され、テーブル内の行をフィルタリングするためではないことに注意してください。そのため、テーブル内のすべての行がパーティション分割されて返されます。このオプションは読み取りにのみ適用されます。

つまり、テーブルには1100行あり、次のように指定します。

lowerBound 0

upperBound 1000および

numPartitions:10、1000〜1100行を失うことはありません。代わりに、意図したよりも多くの行を持つパーティションの一部になります(ストライド値は100です)。

5
Hemanth Gowda