Apache flink Flink表API:使用重叠字段名连接表

Apache flink Flink表API:使用重叠字段名连接表,apache-flink,Apache Flink,我想使用Flink表API连接同一字段上的两个表 我想实施 SELECT a.id b.id FROM table1 AS a JOIN table2 AS b ON a.id = b.id 我试过了,但发现实现目标的唯一方法是 val table1 = tableEnv.fromDataSet(dbData, "id1") val table2 = tableEnv.fromDataSet(dbData, "id2") val res = table1

我想使用Flink表API连接同一字段上的两个表

我想实施

SELECT
    a.id
    b.id
FROM
    table1 AS a
JOIN
    table2 AS b
ON
    a.id = b.id
我试过了,但发现实现目标的唯一方法是

val table1 = tableEnv.fromDataSet(dbData, "id1")
val table2 = tableEnv.fromDataSet(dbData, "id2")
val res = table1.join(table2).where("id1=id2")
但是我想重用密钥“id”

我在Flink文档中发现了以下内容:

两个表必须具有不同的字段名,并且必须使用where或filter运算符定义相等联接谓词


如何重用字段键?

联接结果的模式是两个输入模式的串联。 例如,如果您有
左:[a,b,c]
右:[d,e,f]
的联接结果是一个新的
,其模式为
[a,b,c,d,e,f]

如果
left
right
具有同名字段,则后续操作(如
select
)无法识别字段而不会产生歧义

所以基本上

val left: Table = ???   // [id, valLeft]
val right: Table = ???  // [id, valRight]
val result: Table = left.join(right).where('id === 'id)
相当于SQL查询

SELECT l.id AS id, l.valLeft, r.id AS id, r.valRight
FROM left l, right r
WHERE l.id = r.id
此SQL查询也不会被接受,因为结果中有两个名为
id
的字段

您可以通过以下任一方法解决此问题:

  • 仅重命名其中一个输入字段并重用另一个输入字段
  • 重命名两个输入字段,并在连接后将其中一个字段重命名为
    as

联接结果的模式是两个输入模式的串联。 例如,如果您有
左:[a,b,c]
右:[d,e,f]
的联接结果是一个新的
,其模式为
[a,b,c,d,e,f]

如果
left
right
具有同名字段,则后续操作(如
select
)无法识别字段而不会产生歧义

所以基本上

val left: Table = ???   // [id, valLeft]
val right: Table = ???  // [id, valRight]
val result: Table = left.join(right).where('id === 'id)
相当于SQL查询

SELECT l.id AS id, l.valLeft, r.id AS id, r.valRight
FROM left l, right r
WHERE l.id = r.id
此SQL查询也不会被接受,因为结果中有两个名为
id
的字段

您可以通过以下任一方法解决此问题:

  • 仅重命名其中一个输入字段并重用另一个输入字段
  • 重命名两个输入字段,并在连接后将其中一个字段重命名为
    as