2016-05-03 3 views
4

は、それが単一の列を使用してテーブルを配布するのは簡単です:複数の列の値を使用してテーブルを配布するにはどうすればよいですか? <a href="https://www.citusdata.com/docs/citus/5.0/dist_tables/append_distribution.html" rel="nofollow">the Citus documentation</a>た内容に応じて、

SELECT master_create_distributed_table('github_events', 'created_at', 'append'); 

は、複数の列を使用してテーブルを配布する方法はありますか?たとえば、次のようなものがあります。

SELECT master_create_distributed_table('github_events', 'user_id,site_id', 'append'); 

答えて

5

Citusでは複数の列による配信はサポートされていません。ただし、複合型とpartition your data by that composite typeを作成できます。

- リンクの内容は、ケースには、以下のインライン化され、リンクが死んで行く - ハッシュ・パーティション化

手順は、複合タイプの

  1. は、マスターとすべてのワーカーノードのタイプを作成します。

    CREATE TYPE new_composite_type as (project_key text, date text); 
    
  2. は平等をチェックするための関数を作成し、等価演算子のために関連付け新しいタイプ

    CREATE FUNCTION equal_test_composite_type_function(new_composite_type, new_composite_type) RETURNS boolean 
    AS 'select $1.project_key = $2.project_key AND $1.date = $2.date;' 
    LANGUAGE SQL 
    IMMUTABLE 
    RETURNS NULL ON NULL INPUT; 
    
    -- ... use that function to create a custom equality operator... 
    CREATE OPERATOR = (
        LEFTARG = new_composite_type, 
        RIGHTARG = new_composite_type, 
        PROCEDURE = equal_test_composite_type_function, 
        HASHES 
    ); 
    
  3. 新しいハッシュ関数を作成します。

    注:これは、単純な例であり、良いハッシュ分布を提供しない可能性があります。 SQLの代わりに別のC関数で実装できる良いハッシュ関数の例がいくつかあります。

    CREATE FUNCTION new_composite_type_hash(new_composite_type) RETURNS int 
    AS 'SELECT hashtext(($1.project_key || $1.date)::text);' 
    LANGUAGE SQL 
    IMMUTABLE 
    RETURNS NULL ON NULL INPUT; 
    
  4. BTREEとHASHのアクセス方法について演算子クラスを定義します。

    CREATE OPERATOR CLASS new_op_fam_btree_class 
    DEFAULT FOR TYPE new_composite_type USING BTREE AS 
    OPERATOR 3 = (new_composite_type, new_composite_type); 
    
    CREATE OPERATOR CLASS new_op_fam_hash_class 
    DEFAULT FOR TYPE new_composite_type USING HASH AS 
    OPERATOR 1 = (new_composite_type, new_composite_type), 
    FUNCTION 1 new_composite_type_hash(new_composite_type); 
    
  5. は、新しいタイプのテーブルを作成し、それを配布します。

    CREATE TABLE composite_type_partitioned_table 
    (
        id integer, 
        composite_column new_composite_type 
    ); 
    
    SELECT master_create_distributed_table('composite_type_partitioned_table','composite_column', 'hash'); 
    
    SELECT master_create_worker_shards('composite_type_partitioned_table', 4, 1); 
    
  6. INSERTとSELECTを実行します。適切なプルーニングには、それらのクエリに示されているように引用が必要であることに注意してください。

    INSERT INTO composite_type_partitioned_table VALUES (1, '("key1","20160101")'::new_composite_type); 
    INSERT INTO composite_type_partitioned_table VALUES (2, '("key1","20160102")'::new_composite_type); 
    INSERT INTO composite_type_partitioned_table VALUES (3, '("key2","20160101")'::new_composite_type); 
    INSERT INTO composite_type_partitioned_table VALUES (4, '("key2","20160102")'::new_composite_type); 
    
    SELECT * FROM composite_type_partitioned_table WHERE composite_column = '("key1", "20160101")'::new_composite_type; 
    
    UPDATE composite_type_partitioned_table SET id = 6 WHERE composite_column = '("key2", "20160101")'::new_composite_type; 
    
    SELECT * FROM composite_type_partitioned_table WHERE composite_column = '("key2", "20160101")'::new_composite_type; 
    

その他の注意事項:

  1. 入力ファイルが正しく区切られなければならないcopy_to_distributed_tableが機能するようにする:を警戒するには、2冊のノートがあります

。これを行うには、普通のテーブルのCOPY (SELECT()::composite_type_field, ....);をファイルに使用してからロードします。

  • 選択クエリでプルーニングを行うには、複合型フィールドを引用符で囲む必要があります。

  • 関連する問題

     関連する問題