如何使用Flink时态表?

时间:2019-01-30 13:21:45

标签: apache-flink

Flink中新的临时表看上去很棒,但是我还不能使它们起作用。由于我找不到任何有效的示例,所以我想知道是否有人可以使用它,并且可以指出我做错了什么。

这里有一些上下文:

查询:

SELECT s.id FROM sitemembership AS m, LATERAL TABLE (site(m.ts)) AS s WHERE m.siteId = s.id

设置:

// { "streamName": "sitemembership", "key": "siteId" }
Table table = tableEnv.fromDataStream(stream, String.join(",", rowTypeInfo.getFieldNames()) + ",ts.rowtime");
table.printSchema();
tableEnv.registerTable(streamName, table);

// { "streamName": "site", "key": "id" }
Table table = tableEnv.fromDataStream(stream, String.join(",", rowTypeInfo.getFieldNames()) + ",ts.rowtime");
TemporalTableFunction temporalTable = table.createTemporalTableFunction("ts", key);
tableEnv.registerFunction(streamName, temporalTable);

我没有任何行,也没有错误。我试图通过更改我注册为临时表的表来翻转查询,但没有成功。我还查看了“ ts”列,并获取了一些日期,这些日期使我相信我应该至少得到几行。

感谢您的帮助。

P.S。我正在从kafka的历史数据上运行此数据,该数据在“ id”上也是分区键

1 个答案:

答案 0 :(得分:2)

您可以找到测试here形式的功能全面的“示例”(在文档here和{中或多或少地重复了这两个测试的内容(处理时间甚至时间)。 {3}}或here)。您可以从这些示例开始,然后逐步将它们转换为您的确切用例/场景。首先开始使用预定义的数据集,然后再切换到从Kafka读取数据,可能会有所帮助。

关于您的问题,从您的代码段中不清楚什么是错误的,以及一些潜在的问题:

    未分配
  • 水印/不增加水印(在链接的assignTimestampsAndWatermarks()中调用testEventTimeInnerJoin())。时间联接运算符仅在水印上发出数据。
  • 您尝试连接的两个表之间的
  • 行时间不同步。如果site没有足够老的行可以与sitemembership记录联接,则结果将为空。例如,如果来自site的所有记录都具有年份2019的时间字段,而sitemembership仅具有来自2018的记录。