创建从超表触发写入普通表的流计算总是失败

【TDengine 使用环境】
测试环境

【TDengine 版本】

OSS 3.3.7.5

【操作系统以及版本】

Ubuntu 22.04

【部署方式】容器

【集群节点数】1

【集群副本数】1

【描述业务影响】无法新建流

【问题复现路径/shan】

【遇到的问题:问题现象及影响】

meas_bms是超级表,我希望实现的流是meas_bms子表中写入数据的时候,将数据写入一张普通表events_flat_rows,但是一直报错 DB error: Out super table exists and is not super table [0x80004110]。也确认了events_flat_rows是普通表,建表语句CREATE TABLE events_flat_rows (ts TIMESTAMP, msg VARCHAR(256), v DOUBLE, st_id SMALLINT, v_id SMALLINT, m_id INT, lv SMALLINT)。为什么会报这个错呢,如何解决?

【资源配置】

【报错完整截图】

@TDuser_8x17_7297 @Kane

  1. 报错原因:
    这个建流语句中,触发表是一个超级表且按照 tbname 分组,所以输出表必须是一个超级表。否则 meas_bms 不同子表下时间戳相同的数据,可能在写入结果表时,会互相覆盖。
  2. 解决方法:将输出表 events_flat_rows 创建成超级表,或者让流自动创建。

如果有任何其他问题,欢迎反馈!

我尝试过写入超级表,但是没有办法用源表tags中的值给目的表的tags进行赋值,如上图的m_id、st_id这些字段。样例如下:将events_flat_rows提升为超级表,写入超级表的时候需要拼接OUTPUT_SUBTABLE和tags的值,比如INTO energy_storage.events_flat_rows
OUTPUT_SUBTABLE(concat(‘events_’, st_id, ‘', v_id, '’, m_id))
(ts, v, q)
TAGS(st_id SMALLINT AS st_id, v_id SMALLINT AS v_id, m_id INT AS m_id)
AS
SELECT ts, v, q FROM %%trows; 但是实际这样是没法实现的,好像不允许tags以及OUTPUT_SUBTABLE中出现非常量,那请问应该如何实现我的需求呢?

我理解的需求:

  1. 源表数据同步到结果表;
  2. 结果子表保留 对应子表的所有 tag 值;

可以在建流语句中指定 tag 列和对应关系,以下是一个简单的例子:

create stable st(ts timestamp, c1 int) tags (t1 int, t2 double);
create table t1 using st tags (1, 1.1);
create table t2 using st tags (2, 2.2);
create stream s1 count_window(1) from st partition by tbname, t1, t2 into out tags(t1 int as t1, t2 double as t2) as select ts, c1 from %%trows;

这个t1 t2复用了,不清楚具体的含义,能否重新写一下,谢谢。另外你上面给出的into out tags(t1 int as t1, t2 double as t2),我试过是不可以的,一直会报错invalid column t1,我用的是OSS 3.3.7.5

上面的例子可能有点困惑,我们以 tags (out_t1 int as t1, out_t2 double as t2) 为例进行说明:

  1. out_t1 和 out_t2 是结果表 out 的 tag 列名,它们的类型必须和 as 后面的列类型一致;
  2. t1 和 t2 是源表 st 的 tag 列名;

报错的原因,是不是你的源表 tag 列不叫这个名字?需要对应修改。另外,需要保证它们出现在 partition by tbname 之后,像举的例子一样。

问题已解决,谢谢

此话题已在最后回复的 10 天后被自动关闭。不再允许新回复。