嗨,实际上我在一个项目中使用cassandra,但是我在一段时间内解决了物化视图的问题,解释了我在cassandra和问题中的设置。
我在Google Cloud中有两个实例,每个实例都有一个具有下一个要求的节点:
在服务器上
每当我更新具有重要视图的表时,前者都会正确更新,但物化视图不会反映这些更改。
表格行为的示例有23个字段:
物化视图仅复制原始表中的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个物化视图也存在同样的问题。
答案 0 :(得分:0)
在Cassandra 3.10之前
不属于基表主键的列只能受IS NOT NULL限制的限制。没有其他限制。
在Cassandra 3.10中,问题通过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语句:
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