2016-05-03 3 views

Répondre

5

La distribution par plusieurs colonnes n'est pas prise en charge dans Citus. Toutefois, vous pouvez créer un type composite et partition your data by that composite type.

- Contenu du lien ci-dessous inline dans le cas où le lien est mort -

étapes pour hachage partitionnement sur les types composites

  1. Créer le type sur le maître et tous les nœuds de travailleurs:

    CREATE TYPE new_composite_type as (project_key text, date text); 
    
  2. Créer une fonction pour vérifier l'égalité, et l'associer à l'opérateur d'égalité pour le nouveau type

    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. Créer une nouvelle fonction de hachage.

    Remarque: Ceci est juste un exemple simple qui peut ne pas fournir une bonne distribution de hachage. Il existe plusieurs exemples de bonnes fonctions de hachage qui peuvent être implémentées dans une fonction C séparée au lieu de SQL.

    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. Définir les classes d'opérateur pour les BTREE et méthodes d'accès 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. Créer la table avec le nouveau type et de le distribuer.

    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. Exécutez INSERT et SELECT. Notez que l'élagage correct nécessitera la citation comme indiqué dans ces requêtes.

    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; 
    

Autres notes:

Il y a deux notes à se méfier:

  1. fichier d'entrée doit être correctement délimité pour permettre copy_to_distributed_table de travailler. Pour ce faire, utilisez un COPY (SELECT()::composite_type_field, ....); de la table normale dans un fichier, puis chargez.

  2. Pour que l'élagage fonctionne avec des requêtes select, le champ de type composite doit être entre guillemets.