Snowflake Stream стал пустым, даже если мы потребляем всего несколько записей из данных Stream
Я вижу, что набор потоковых данных стал пустым, даже если я использую только одну запись из набора потоковых данных. Я не думаю, что это правильно.
Вот шаги, которые я сделал. - Создайте таблицу для хранения имен и сборов, выплачиваемых участниками тренажерного зала, создания или замены элементов таблицы (номер идентификатора (8) не равен нулю, имя varchar(255) по умолчанию null, номер комиссии (3) ноль);
- Создать поток для отслеживания изменений на текущий момент в таблице MEMBERS, создать или заменить поток member_check на элементах таблицы;
- Создайте таблицу для хранения дат, когда участники тренажерного зала присоединились для создания или замены регистрации в таблице (номер идентификатора (8), дата даты);
вставить в члены (id,name,fee) значения (1,'Joe',0), (2,'Jane',0), (3,'George',0), (4,'Betty',0), (5,'Салли',0);
вставить в значения подписки (1,'2018-01-01'),(2,'2018-02-15'),(3,'2018-05-01'),(4,'2018-07-16'),(5,'2018-08-21');
- Поток записывает вставленные строки select * from member_check;
+----+--------+-----+-----------------+-------------------+------------------------------------------+
| ID | NAME | FEE | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID |
|----+--------+-----+-----------------+-------------------+------------------------------------------|
| 1 | Joe | 0 | INSERT | False | d200504bf3049a7d515214408d9a804fd03b46cd |
| 2 | Jane | 0 | INSERT | False | d0a551cecbee0f9ad2b8a9e81bcc33b15a525a1e |
| 3 | George | 0 | INSERT | False | b98ad609fffdd6f00369485a896c52ca93b92b1f |
| 4 | Betty | 0 | INSERT | False | e554e6e68293a51d8e69d68e9b6be991453cc901 |
| 5 | Sally | 0 | INSERT | False | c94366cf8a4270cf299b049af68a04401c13976d |
+----+--------+-----+-----------------+-------------------+------------------------------------------+
- Примените взнос в размере 90 долларов США к участникам, которые присоединились к тренажерному залу после окончания бесплатного пробного периода: объединитесь с участниками m, используя (выберите id, dt из регистрационных номеров, где dateiff(day, '2018-08-15'::date, s.dt::date)<-30) s на m.id = s.id при совпадении затем обновить набор m.fee = 90;
выберите * из участников;
+----+--------+-----+
| ID | NAME | FEE |
|----+--------+-----|
| 1 | Joe | 90 |
| 2 | Jane | 90 |
| 3 | George | 90 |
| 4 | Betty | 0 |
| 5 | Sally | 0 |
+----+--------+-----+
- Поток записывает обновленный столбец FEE как набор вставок - а не удаляет и вставляет, потому что содержимое потока - еще не было использовано select * from member_check;
+----+--------+-----+-----------------+-------------------+------------------------------------------+
| ID | NAME | FEE | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID |
|----+--------+-----+-----------------+-------------------+------------------------------------------|
| 1 | Joe | 90 | INSERT | False | 957e84b34ef0f3d957470e02bddccb027810892c |
| 2 | Jane | 90 | INSERT | False | b00168a4edb9fb399dd5cc015e5f78cbea158956 |
| 3 | George | 90 | INSERT | False | 75206259362a7c89126b7cb039371a39d821f76a |
| 4 | Betty | 0 | INSERT | False | 9b225bc2612d5e57b775feea01dd04a32ce2ad18 |
| 5 | Sally | 0 | INSERT | False | 5a68f6296c975980fbbc569ce01033c192168eca |
+----+--------+-----+-----------------+-------------------+------------------------------------------+
- Создайте таблицу для хранения сведений о членах в производственной среде, создайте или замените таблицу members_prod (номер идентификатора (8) не равен нулю, имя varchar(255) по умолчанию null, номер комиссии (3) null);
- Вставьте первый пакет потоковых данных в производственную таблицу, вставьте в members_prod(id,name,fee) выберите id, name, fee из member_check, где метаданные $action = 'INSERT' и id=1;
в приведенном выше операторе вставки я использовал только одну запись, т.е. id=1 из набора потоковых данных (member_check), но после этого мой набор потоковых данных стал пустым и готов к новому смещению.
Это означает, что Snowflake не проверяет, какие записи потребляются из набора данных потока. Как только любой оператор DML запускается в наборе данных потока, Snowflake предполагает, что все записи были использованы, и очищает набор данных потока. (Сик!!!)
2 ответа
Можно обрабатывать поток порциями, но вы должны использовать явные транзакции.
BEGIN WORK;
INSERT INTO table1 SELECT FROM your_stream WHERE <condition1>;
INSERT INTO table2 SELECT FROM your_stream WHERE <condition2>;
COMMIT;
Поток будет очищен после фиксации.
Потоки - все еще довольно новая функция, и это меня тоже удивило, но любой оператор DML увеличивает смещение для потока. Мое открытие связано с неудачной транзакцией в хранимой процедуре, которая опустошила поток.
Наилучший вариант сейчас - либо использовать все изменения в потоке сразу в рамках одной транзакции, либо вместо этого использовать функцию ИЗМЕНЕНИЙ из путешествия во времени.