Почему мои представления материализованные представления не отражают этих изменений?

Привет, на самом деле я работаю с cassandra над проектом, но у меня проблема с материализованными представлениями, через мгновение объясните мои настройки в cassandra и проблему.

У меня есть два экземпляра в Google Cloud, каждый экземпляр имеет узел со следующими требованиями:

  • Кассандра версии 3.10.0
  • CQLSH версии 5.0.1

На сервере

  • 1 ядерный процессор Haswell
  • 6,5 ГБ оперативной памяти
  • Жесткий диск 240 ГБ
  • Сервер 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 материализованных представлений имеют ту же проблему.


person carson314    schedule 04.08.2017    source источник
comment
Показать схему базовой таблицы   -  person Ashraful Islam    schedule 04.08.2017


Ответы (1)


До Cassandra 3.10

Столбцы, не являющиеся частью первичного ключа базовой таблицы, могут быть ограничены только ограничением IS NOT NULL. Никаких других ограничений не допускается.

В Cassandra 3.10 проблема решена с помощью CASSANDRA-10368

  • Поддержка фильтрации столбцов, отличных от PRIMARY KEY, в предложении WHERE оператора CREATE MATERIALIZED VIEW (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);

Вы должны добавить отсутствующий столбец, иначе он не отразит ваши изменения правильно. Это открытая проблема в кассандре

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

person Ashraful Islam    schedule 04.08.2017
comment
Я использую Cassandra 3.10, и проблема остается: материализованное представление не обновляется, как только я обновляю таблицу. Есть ли какой-то особый способ обновить таблицу, чтобы обновить материализованное представление? - person carson314; 04.08.2017
comment
@ carson314 Нашел решение проверьте обновленный ответ - person Ashraful Islam; 05.08.2017