2017-08-04 30 views
0

其實我在cassandra上的一個項目上工作,但是我在一瞬間解釋了我在cassandra和問題中的設置時遇到了物化視圖的問題。爲什麼我的觀點物化視圖不反映這些變化?

我有兩個實例在谷歌雲,每個實例有下一個需求的節點:

  • 卡桑德拉版本3.10.0
  • CQLSH版本5.0.1

在服務器

  • 1核-CPU Haswell
  • 6.5GB RAM
  • HDD 240GB
  • Ubuntu服務器16.04.2 LTS

每當我更新已materilized意見表,前者被正確地更新,但物化視圖不反映這些變化。

錶行爲類似這個的例子具有23個字段:用於分區和聚類鍵

  • 4字段
  • 12字段被用作條件數據
  • 7字段標誌物化視圖定義
  • 8二級索引應用許多領域

物化視圖只從原始表中複製12個字段,並且這些標誌不包含在這些字段中。

修改的物化視圖句子

例子:

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); 

是在DESCRIBE我的表

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'; 

對不起,但我的表是寫在西班牙語

當一個INSERT語句與滿足給定的條件值執行修訂

,表和物化視圖恰當地反映了變化。

問題是何時執行帶有無效值的INSERT語句,然後執行UPDATE語句以使值滿足matryize視圖的給定條件;在這種情況下,這些更改會反映在表中,但不會反映在實體化視圖中。

考慮到項目的要求,此工作流程是必不可少的。

在這種情況下,當執行和INSERT語句時,不需要在實例化視圖中顯示值,直到執行具有正確值的UPDATE語句爲止,這是使用一些布爾標誌驗證數據並且我們想要利用物化視圖來隱藏或顯示數據。

需要注意的是,我們正在使用具有40個表和19個物化視圖的單個鍵空間,10個物化視圖具有相同的問題。

+0

顯示您的基本表架構 –

回答

0

卡桑德拉3.10之前

不屬於基表主鍵的一部分的列只能由被限制IS NOT NULL限制。沒有其他限制是允許的。

在卡桑德拉3.10的問題的解決,是CASSANDRA-10368

  • 支持在CREATE 非主鍵列過濾MATERIALIZED VIEW語句的WHERE子句(CASSANDRA-10368)

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

編輯#1

我想你插入或插入的數據不滿足where子句時缺少一些字段。在你的情況下數據將被複制到實體化視圖當且僅當數據滿足以下條件你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 

在這裏,在限定的是,滿足上述條件的例子插入語句:

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 
); 

輸出:

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 

編輯#2

發現問題,問題是出在你的物化視圖定義,你有一些列(creada_sin_mostrar, validado, modificado, revisado, eliminacion, revalidado)定義關係的where子句,其在選擇中不存在條款。在選擇子句中添加缺少的列。

所以你的物化視圖模式應該是:

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); 

你必須添加缺少的列否則將無法正確反映你的變化。這是一個開放的問題卡桑德拉

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

+0

我使用卡桑德拉3.10和問題仍然存在,物化視圖不只要我更新表更新。是否有任何特殊的方式來更新表格以便更新物化視圖? – carson314

+0

@ carson314回答更新 –

+0

問題更新 – carson314