Apache flink Flink表API:使用重叠字段名连接表
我想使用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
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