2017-08-04 5 views
0

Salut en fait, je travaille avec Cassandra sur un projet, mais j'ai un problème avec les vues matérialisées dans un moment expliquer mes paramètres dans Cassandra et le problème.Pourquoi les vues matérialisées par mes vues ne reflètent-elles pas ces changements?

J'ai deux instances dans Google Cloud, chaque instance a un nœud avec les exigences suivantes:

  • Version Cassandra 3.10.0
  • version CQLSH 5.0.1

Sur le serveur

  • 1 cœur-CPU Haswell
  • 6.5GB RAM
  • HDD 240GB
  • Ubuntu Server 16.04.2 LTS

Chaque fois que je mets à jour une table qui a des vues materilized, l'ancien est mis à jour correctement, mais les vues matérialisées ne reflètent pas ces changements.

Un exemple de table qui se comporte comme cela a 23 champs:

  • 4 champs pour les clés de séparation et de regroupement
  • 12 champs de données
  • 7 champs pour les drapeaux qui sont utilisés comme conditions pour la vue matérialisée définition
  • 8 index secondaires appliquent un nombreux domaines

La vue matérialisée Copie seulement 12 champs de la table d'origine et les drapeaux ne sont pas inclus sur ceux-ci.

MODIFIÉ

Exemple d'une phrase de vue matérialisée:

CREATE MATERIALIZED VIEW IF NOT EXISTS sav.laboratorio_unidad AS 
    SELECT unidad_politecnica, seccion_politecnica, modulo, datos_modificados, /* Primary Key */ 
     tipo, id_contacto, contacto, foto, descripcion, 
     area, palabra_clave, sector_impacto /* Clasificación */ 
    FROM sav.laboratorio 
    WHERE tipo IS NOT NULL 
     AND unidad_politecnica IS NOT NULL 
     AND seccion_politecnica IS NOT NULL 
     AND modulo IS NOT NULL 
     AND datos_modificados IS NOT NULL 
     AND creada_sin_mostrar = false 
     AND datos_modificados = false 
     AND validado = true 
     AND modificado IS NOT NULL 
     AND revisado IS NOT NULL 
     AND eliminacion = false 
     AND revalidado IS NOT NULL 
    PRIMARY KEY ((unidad_politecnica), seccion_politecnica, tipo, modulo, datos_modificados); 

Est-ce le DESCRIBE de ma table

CREATE TABLE sav.laboratorio (
    unidad_politecnica text, 
    seccion_politecnica text, 
    modulo text, 
    datos_modificados boolean, 
    actualizado timestamp, 
    area set<text>, 
    certificado set<frozen<prueba>>, 
    contacto frozen<contacto>, 
    creada_sin_mostrar boolean, 
    creado timestamp, 
    descripcion text, 
    eliminacion boolean, 
    equipamiento frozen<equipo>, 
    foto frozen<archivo>, 
    id_contacto uuid, 
    modificado boolean, 
    palabra_clave set<text>, 
    revalidado boolean, 
    revisado boolean, 
    sector_impacto set<text>, 
    solicitud_eliminacion boolean, 
    tipo text, 
    validado boolean, 
    PRIMARY KEY (unidad_politecnica, seccion_politecnica, modulo, datos_modificados) 
) WITH CLUSTERING ORDER BY (seccion_politecnica ASC, modulo ASC, datos_modificados ASC) 
    AND bloom_filter_fp_chance = 0.01 
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} 
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} 
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND crc_check_chance = 1.0 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99PERCENTILE'; 
CREATE INDEX laboratorio_creado_sin_mostrar_index ON sav.laboratorio (creada_sin_mostrar); 
CREATE INDEX laboratorio_solicitud_eliminacion_index ON sav.laboratorio (solicitud_eliminacion); 
CREATE INDEX laboratorio_id_contacto_index ON sav.laboratorio (id_contacto); 
CREATE INDEX laboratorio_revisado_index ON sav.laboratorio (revisado); 
CREATE INDEX laboratorio_validado_index ON sav.laboratorio (validado); 
CREATE INDEX laboratorio_actualizado_index ON sav.laboratorio (actualizado); 
CREATE INDEX laboratorio_modificado_index ON sav.laboratorio (modificado); 
CREATE INDEX laboratorio_revalidado_index ON sav.laboratorio (revalidado); 

CREATE MATERIALIZED VIEW sav.laboratorio_unidad AS 
    SELECT unidad_politecnica, seccion_politecnica, tipo, modulo, datos_modificados, area, contacto, descripcion, foto, id_contacto, palabra_clave, sector_impacto 
    FROM sav.laboratorio 
    WHERE tipo IS NOT NULL AND unidad_politecnica IS NOT NULL AND seccion_politecnica IS NOT NULL AND modulo IS NOT NULL AND datos_modificados IS NOT NULL AND creada_sin_mostrar = false AND datos_modificados = false AND validado = true AND modificado IS NOT NULL AND revisado IS NOT NULL AND eliminacion = false AND revalidado IS NOT NULL 
    PRIMARY KEY (unidad_politecnica, seccion_politecnica, tipo, modulo, datos_modificados) 
    WITH CLUSTERING ORDER BY (seccion_politecnica ASC, tipo ASC, modulo ASC, datos_modificados ASC) 
    AND bloom_filter_fp_chance = 0.01 
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} 
    AND comment = '' 
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} 
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND crc_check_chance = 1.0 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99PERCENTILE'; 

Désolé, mais ma table a été écrit en espagnol

MISE À JOUR

Lorsqu'une instruction INSERT est exécutée avec des valeurs qui satisfait aux compte tenu des conditions, la table et la vue matérialisée reflète les changements correctement. Le problème survient lorsqu'une instruction INSERT avec des valeurs non valides est exécutée, puis une instruction UPDATE est exécutée afin de rendre les valeurs conformes aux conditions données de la vue matérialisée; dans ce cas, les modifications sont reflétées dans la table mais ne sont pas répercutées sur la vue matérialisée.

Ce flux de travail est nécessaire compte tenu des exigences du projet.Dans ce cas, lors de l'exécution et de l'instruction INSERT, il n'est pas nécessaire d'afficher les valeurs dans la vue matérialisée jusqu'à ce que l'instruction UPDATE avec les valeurs correctes soit exécutée, ceci est une validation des données avec des indicateurs booléens. utiliser la vue matérialisée pour cacher ou montrer les données. Quelque chose à noter est que nous utilisons un seul espace de touches avec 40 tables et 19 vues matérialisées, 10 vues matérialisées ont le même problème.

+0

Montrez votre table de base schéma –

Répondre

0

Avant Cassandra 3,10

Les colonnes qui ne font pas partie de la table de base clé primaire ne peut être limitée par un IS NOT NULL restriction. Aucune autre restriction n'est autorisée.

Dans Cassandra 3.10 le problème est résolu avec CASSANDRE-10368

  • en charge le filtrage sur des colonnes de clé primaire dans la clause WHERE de l'instruction CREATE MATERIALIZED VIEW clause (CASSANDRE-10368)

Source: https://github.com/apache/cassandra/blob/trunk/CHANGES.txt#L361

Modifié # 1

Je pense qu'il vous manque un champ lorsque l'insertion ou vos données insérées ne satisfont pas la clause where.Dans votre cas, les données seront copiées dans la vue matérialisée Si et seulement si les données satisfont la condition suivante vous définissez dans la clause where

tipo IS NOT NULL 
AND unidad_politecnica IS NOT NULL 
AND seccion_politecnica IS NOT NULL 
AND modulo IS NOT NULL 
AND datos_modificados IS NOT NULL 
AND creada_sin_mostrar = false 
AND datos_modificados = false 
AND validado = true 
AND modificado IS NOT NULL 
AND revisado IS NOT NULL 
AND eliminacion = false 
AND revalidado IS NOT NULL 

Voici une instruction d'insertion exemple qui satisfont la condition ci-dessus:

INSERT INTO laboratorio (
    tipo, 
    unidad_politecnica, 
    seccion_politecnica, 
    modulo, 
    datos_modificados, 
    modificado, 
    revisado, 
    revalidado, 
    creada_sin_mostrar, 
    eliminacion, 
    validado 
) VALUES ( 
    'tipo', 
    'unidad', 
    'seccion', 
    'modulo', 
    false, 
    true, 
    true, 
    true, 
    false, 
    false, 
    true 
); 

sortie:

cqlsh:sav> SELECT * FROM laboratorio_unidad ; 

@ Row 1 
---------------------+--------- 
unidad_politecnica | unidad 
seccion_politecnica | seccion 
tipo    | tipo 
modulo    | modulo 
datos_modificados | False 
area    | null 
descripcion   | null 
id_contacto   | null 
palabra_clave  | null 
sector_impacto  | null 

Modifié # 2

trouvé le problème, le problème est dans votre vue matérialisée Définition, dans la clause where vous définir relation avec une colonne (creada_sin_mostrar, validado, modificado, revisado, eliminacion, revalidado) qui ne figure pas dans la sélection clause. Ajoutez la colonne manquante dans la clause de sélection.

Ainsi, votre vue matérialisée schéma devrait être:

CREATE MATERIALIZED VIEW IF NOT EXISTS sav.laboratorio_unidad AS 
    SELECT unidad_politecnica, seccion_politecnica, modulo, datos_modificados, 
     tipo, id_contacto, contacto, foto, descripcion, 
     area, palabra_clave, sector_impacto, 
     creada_sin_mostrar, validado, modificado, revisado, eliminacion, revalidado 
    FROM sav.laboratorio 
    WHERE tipo IS NOT NULL 
     AND unidad_politecnica IS NOT NULL 
     AND seccion_politecnica IS NOT NULL 
     AND modulo IS NOT NULL 
     AND datos_modificados IS NOT NULL 
     AND creada_sin_mostrar = false 
     AND datos_modificados = false 
     AND validado = true 
     AND modificado IS NOT NULL 
     AND revisado IS NOT NULL 
     AND eliminacion = false 
     AND revalidado IS NOT NULL 
    PRIMARY KEY ((unidad_politecnica), seccion_politecnica, tipo, modulo, datos_modificados); 

Vous devez ajouter la colonne manquante sinon il ne reflète pas votre changement correctement. C'est une question ouverte dans cassandra

https://issues.apache.org/jira/browse/CASSANDRA-13547 https://issues.apache.org/jira/browse/CASSANDRA-11500

+0

J'utilise Cassandra 3.10 et le problème reste, la vue matérialisée ne met pas à jour dès que je mets à jour la table.Existe-t-il un moyen spécial de mettre à jour la table afin de mettre à jour la vue matérialisée? – carson314

+0

@ carson314 Réponse mise à jour –

+0

Question mise à jour – carson314