web-dev-qa-db-ja.com

pysparkは、partitionbyを使用してデータを分割する

partitionBy関数がデータを分割することを理解しています。 rdd.partitionBy(100)を使用すると、キーによってデータが100の部分に分割されます。つまり、類似したキーに関連付けられたデータはグループ化されます

  1. 私の理解は正しいですか?
  2. パーティションの数を使用可能なコアの数と同じにすることはお勧めですか?それにより処理がより効率的になりますか?
  3. データがキー、値の形式でない場合はどうなりますか?この機能を引き続き使用できますか?
  4. 私のデータがserial_number_of_student、student_nameだとしましょう。この場合、データをserial_numberではなく、student_nameでパーティション化できますか?
11
user2543622
  1. ではない正確に。 PySparkを含むSpark は、デフォルトではハッシュパーティショニング を使用します。同一のキーを除外すると、単一のパーティションに割り当てられたキー間に実質的な類似性はありません。
  2. ここに簡単な答えはありません。すべてはデータの量と利用可能なリソースに依存します。 パーティションが多すぎる または少なすぎると、パフォーマンスが低下します。

    いくつかのリソース は、パーティションの数は利用可能なコアの数の約2倍でなければならないと主張しています。一方、1つのパーティションには通常128MBを超えることはできず、1つのシャッフルブロックは2GBを超えることはできません( SPARK-6235 を参照)。

    最後に、潜在的なデータスキューを修正する必要があります。データセットで一部のキーが過剰に表現されていると、リソースの使用が最適化されず、失敗する可能性があります。

  3. いいえ、または少なくとも直接ではありません。 keyByメソッドを使用して、RDDを必要な形式に変換できます。さらに、任意のPythonオブジェクトはキーと値のペアとして扱うことができます。これは、長さIterableのように動作させる必要なメソッドを実装している限り オブジェクトがPySparkで有効なキーと値のペアであるかどうかを判断する方法 を参照してください。

  4. 種類によって異なります。キーがhashable *である限り、はい。通常、これは不変の構造でなければならず、それに含まれるすべての値も不変でなければならないことを意味します。たとえば、 リストは有効なキー ではありませんが、整数のTupleは有効です。

引用するには Python用語集

オブジェクトは、その存続期間中に変更されないハッシュ値(__hash__()メソッドが必要)があり、他のオブジェクトと比較できる(__eq__()メソッドが必要)場合、ハッシュ可能です。 。等しいと比較するハッシュ可能なオブジェクトは、同じハッシュ値を持つ必要があります。

13
zero323