【问题标题】:Why my views materialized views don't reflect those changes?为什么我的视图物化视图没有反映这些变化?
【发布时间】:2018-01-11 19:51:16
【问题描述】:

您好,实际上我在一个项目中使用 cassandra,但是我遇到了物化视图的问题,请稍后解释我在 cassandra 中的设置和问题。

我在 Google Cloud 中有两个实例,每个实例都有一个具有以下要求的节点:

  • Cassandra 版本 3.10.0
  • CQLSH 版本 5.0.1

在服务器上

  • 1 核-CPU Haswell
  • 6.5GB 内存
  • 硬盘 240GB
  • Ubuntu 服务器 16.04.2 LTS

每当我更新具有物化视图的表时,前者会正确更新,但物化视图不会反映这些更改。

如下表的示例有 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语句被执行以使值满足实体化视图的给定条件时;在这种情况下,更改会反映在表中,但不会反映在物化视图中。

鉴于项目的要求,此工作流程是必要的。

在这种情况下,当执行 INSERT 语句时,不需要在物化视图中显示值,直到执行具有正确值的 UPDATE 语句,这是使用一些布尔标志验证数据,我们想要利用物化视图来隐藏或显示数据。

需要注意的是,我们使用的是具有 40 个表和 19 个物化视图的单个键空间,10 个物化视图存在相同的问题。

【问题讨论】:

  • 显示您的基表架构

标签: cassandra cqlsh materialized-views cassandra-3.0


【解决方案1】:

Cassandra 3.10 之前

不属于基表主键的列只能受 IS NOT NULL 限制。不允许有其他限制。

在 Cassandra 3.10 中,问题通过 CASSANDRA-10368 得到解决

  • 支持对 CREATE 中的非 PRIMARY KEY 列进行过滤 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

发现问题,问题出在您的物化视图定义中,在 where 子句中,您定义了与选择子句中不存在的某些列 (creada_sin_mostrar, validado, modificado, revisado, eliminacion, revalidado) 的关系。在选择子句中添加缺少的列。

所以你的物化视图模式应该是:

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

您必须添加缺少的列,否则它将无法正确反映您的更改。这是 cassandra 中的一个未解决问题

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

【讨论】:

  • 我正在使用 Cassandra 3.10,但问题仍然存在,物化视图在我更新表后不会立即更新。是否有任何特殊的方法来更新表以更新物化视图?
  • @carson314 找到解决方案检查更新的答案
猜你喜欢
  • 2010-09-10
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2014-06-07
  • 1970-01-01
相关资源
最近更新 更多