leftOuterJoin引发TableException:不支持的联接类型“ LEFT”

时间:2018-07-16 20:27:43

标签: scala apache-flink flink-sql

我正在尝试在两个表上运行左外部联接,并将结果转换为DataStream。

在使用flink之前,我完成的所有连接都是内部连接,而我一直在连接之后使用.toRetractStream[MyCaseClass](someQueryConfig)。但是,由于由于左连接而引入了空值,因此我从flink docs的理解是,我无法再使用用例类,因为它们在将表转换为DataStream时不支持空值。

因此,我正在尝试使用POJO来完成此任务。这是我的代码:

class EnrichedTaskUpdateJoin(val enrichedTaskId: String, val enrichedTaskJobId: String, val enrichedTaskJobDate: String, val enrichedTaskJobMetadata: Json, val enrichedTaskStartedAt: String, val enrichedTaskTaskMetadata: Json, val taskUpdateMetadata: Json = Json.Null) {}

val qConfig = tableEnv.queryConfig
qConfig.withIdleStateRetentionTime(IDLE_STATE_RETENTION_TIME)

val updatedTasksUpsertTable = enrichedTasksUpsertTable
  .leftOuterJoin(taskUpdatesUpsertTable, 'enrichedTaskId === 'taskUpdateId)
  .select(
    'enrichedTaskId,
    'enrichedTaskJobId,
    'enrichedTaskJobDate,
    'enrichedTaskJobMetadata,
    'enrichedTaskStartedAt,
    'enrichedTaskTaskMetadata,
    'taskUpdateMetadata
  )

val updatedEnrichedTasksStream: KeyedStream[String, String] = updatedTasksUpsertTable
  .toAppendStream[EnrichedTaskUpdateJoin](qConfig)
  .map(toEnrichedTask(_))
  .map(encodeTask(_))
  .keyBy(x => parse(x).getOrElse(Json.Null).hcursor.get[String]("id").getOrElse(""))

这可以正常编译,但是当我尝试运行它时,我得到org.apache.flink.table.api.TableException: Unsupported join type 'LEFT'. Currently only non-window inner joins with at least one equality predicate are supported。但是,根据these docs,看来我应该能够进行左联接。还似乎值得注意,该错误是从.toAppendStream[EnrichedTaskUpdateJoin](qConfig)引发的。 我以为错误的non-window部分暗示我的空闲状态保留时间是个问题,所以我取出了查询配置,但遇到了同样的错误。

希望这有足够的上下文,但是如果我需要添加其他内容,请告诉我。另外,我正在运行flink 1.5-SNAPSHOT和Circe进行json解析。我对scala还是很陌生,所以很有可能这只是一些愚蠢的语法错误。

1 个答案:

答案 0 :(得分:1)

Flink 1.5-SNAPSHOT不支持非窗口外部联接。正如您在已发布的链接中看到的那样,“外部联接”旁边没有“流”标记。在1.5中支持时间窗口联接(对时间属性起作用)。

Flink 1.6将提供LEFTRIGHTFULL外部联接(另请参见FLINK-5878)。

顺便说一句。确保EnrichedTaskUpdateJoin确实是POJO,因为POJO需要一个默认的构造函数,而且我想也应该使用var而不是val