首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >雪花流变得空空如也,即使我们只消耗了流数据中的少数记录

雪花流变得空空如也,即使我们只消耗了流数据中的少数记录
EN

Stack Overflow用户
提问于 2020-07-21 20:13:58
回答 2查看 740关注 0票数 3

即使我只使用来自流数据集的一条记录,我也会看到该流数据集变为空。我认为这是不正确的。

这就是我所做的步骤。-创建一个表来存储健身房成员支付的姓名和费用,创建或替换表成员( id号(8)不为空,name varchar(255)默认值为空,收费号(3)为空);

-创建一个流,跟踪成员表中迄今发生的更改,在表成员上创建或替换流member_check;

-创建一个表来存储健身房成员加入时的日期,创建或替换表格注册( id号(8),dt日期);

在成员中插入(id,name,fee)值(1,'Joe',0),(2,'Jane',0),(3,'George',0),(4,‘贝蒂’,0),(5,'Sally',0);

在注册值中插入(1,'2018-01-01'),(2,'2018-02-15'),(3,'2018-05-01'),(4,'2018-07-16'),(5,'2018-08-21');

-流记录插入的行select *来自member_check;

代码语言:javascript
运行
复制
+----+--------+-----+-----------------+-------------------+------------------------------------------+
| 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 = s.id上的m.id=s.id上,当匹配并更新set m.fee =90时,将其合并为用户m(选择id,dt从注册地点datediff(day,‘2018-08-15::date,-30) s on m.id=s.id;

从成员中选择*;

代码语言:javascript
运行
复制
+----+--------+-----+
| ID | NAME   | FEE |
|----+--------+-----|
|  1 | Joe    |  90 |
|  2 | Jane   |  90 |
|  3 | George |  90 |
|  4 | Betty  |   0 |
|  5 | Sally  |   0 |
+----+--------+-----+

-流将更新后的费用列记录为一组插入--而不是删除和插入,因为流内容尚未使用--尚未从member_check中选择*;

代码语言:javascript
运行
复制
+----+--------+-----+-----------------+-------------------+------------------------------------------+
| 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 ( id号(8)不为空,name varchar(255)默认值为空,费用号(3)为空);

-将第一批流数据插入生产表,插入members_prod(id、name、members_prod),选择id、name、member_check,其中元数据$action=‘member_check’和id=1;

在上面的insert语句中,我只使用了一条记录,即来自流数据集(Member_check)的member_check,但在那之后,我的流数据集变得空了,准备好了新的偏移量。

这意味着雪花不检查从流数据集消费的记录,只要在流数据集上触发任何DML语句,雪花就会假设所有记录都已被消耗并清空流数据集。(原文!)

EN

回答 2

Stack Overflow用户

发布于 2022-01-14 10:40:27

可以用块处理流,但必须使用显式事务。

代码语言:javascript
运行
复制
BEGIN WORK;

INSERT INTO table1 SELECT FROM your_stream WHERE <condition1>;
INSERT INTO table2 SELECT FROM your_stream WHERE <condition2>;

COMMIT;

提交后流将被清空。

票数 1
EN

Stack Overflow用户

发布于 2020-11-12 01:38:03

流仍然是一个相当新的特性,这也让我感到惊讶,但是任何DML语句都会为流提供偏移量。我的发现涉及存储过程中一个失败的事务,它清空流。

现在最好的选择是要么在单个事务中一次性使用流中的所有更改,要么从时间旅行中使用变化特性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63022381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档