2017-08-03 4 views
0

トランザクションを格納するときに、さまざまなユースケースに対してクエリをフィルタリングするためのキーが異なることがよくあります。例えば。私は、トランザクションを集約する場合複数のキーに対するスパークorcパーティショニング戦略

が今
jdbcDF.write.format("orc").partitionBy("TX_Date").save("transactions") 

Iは、特定の数ヶ月のためにすぐに集計取引は、しかし、どのようなベースの可能性:カードID、いいえ、取引は次のように日付順に分配することができ

顧客番号、日付がアカウント例えば顧客いいえ?

すべてのトランザクション行にトランザクションIDを格納し、最も一般的なキーで区切られた別々のルックアップテーブル(リンクテーブル)を保持する方が良いでしょうか? など。次のルックアップテーブル:

カードID | TransID

お客様番号| TransID

アカウント番号| TransID

TX_Date | TransID

これはspark & orcの開発のための反パターンですか、または異なるキーで「インデックス登録」するより良い方法がありますか? docsから

答えて

0

を(ORC-ファイルでIは既に行インデックスを使用):

をインデックスは、各列内の各列の最小値と最大値と行位置を含むデータ構造である

ORCはカラム型ファイルフォーマットであり、SQLの方法では索引付けされません。 partitionByは、データのローカリティやファイルの分割方法を制御します。

ファイルに行が均等に分散されていることを確認し、さまざまなパーティションのキーを選択してテストを実行し、正しい選択をしたことを確認します。

+0

partitionByは、そのキーでデータをフォルダに分割します。つまり、特定の範囲または特定のキーを検索すると、フォルダ内のorcファイルを読み込まなくても、sparkは他のすべての項目をスキップできます。 質問は、複数のキーでデータを分割し、示唆したようにルックアップテーブルを作成することで達成できますか?より具体的には、パフォーマンスを向上させます。 – user979899

+0

あなたはおそらく私が答えで書いたもののためにスピードアップを得ることはできません – raam86

関連する問題