在数据流上没有外部 join?


0

我惊讶地发现在Flink(DataStream docs)中没有DataStream的外部 join。

对于DataSet,除了常规 join(DataSet文档)之外,您还有所有选项:leftOuterJoin、rightOuterJoin和fullOuterJoin。但是对于DataStream,你只需要简单的旧 join。

这是因为数据流的一些基本属性使得外部 join不可能存在吗?或者我们可以期待在(接近?)未来?

我真的可以在数据流上使用外部 join来解决我正在处理的问题。。。有没有办法达到类似的行为?

2 答案


0

可以使用数据流.coGroup()转型。CoGroupFunction接收两个迭代器(每个输入一个),为某个 key的所有元素提供服务,如果找不到匹配的元素,则可能为空。这允许实现外部 join功能。

在Flink的下一个版本中,可能会向datastreamapi添加对外部 join的一级支持。我目前不知道有任何这样的努力。不过,在Apache Flink JIRA中创建一个问题可能会有所帮助。


0

一种方法是从stream->table->stream,使用以下api:FLINK table api-OUTER JOIN

下面是一个java示例:

    DataStream<String> data = env.readTextFile( ... );
    DataStream<String> data2Merge = env.readTextFile( ... );

...

tableEnv.registerDataStream("myDataLeft", data, "left_column1, left_column2");
tableEnv.registerDataStream("myDataRight", data2Merge, "right_column1, right_column2");

String queryLeft = "SELECT left_column1, left_column2 FROM myDataLeft";
String queryRight = "SELECT right_column1, right_column2 FROM myDataRight";

Table tableLeft = tableEnv.sqlQuery(queryLeft);
Table tableRight = tableEnv.sqlQuery(queryRight);

Table fullOuterResult = tableLeft.fullOuterJoin(tableRight, "left_column1 == right_column1").select("left_column1, left_column2, right_column2");
DataStream&lt;Tuple2&lt;Boolean, Row&gt;&gt; retractStream = tableEnv.toRetractStream(fullOuterResult, Row.class);


我来回答

写文章

提问题

面试题