我很惊讶地发现Flink(DataStream docs)中DataStream
没有外部联接。
对于DataSet
,除了常规leftOuterJoin
(DataSet docs)之外,您还拥有所有选项:rightOuterJoin
,fullOuterJoin
和join
。但是对于DataStream
,你只需要普通的旧连接。
这是由于DataStream
的一些基本属性导致无法进行外连接吗?或者也许我们可以在(接近?)未来期待这一点?
我真的可以在DataStream
上使用外部联接来处理我正在处理的问题......有没有办法实现类似的行为?
答案 0 :(得分:0)
您可以使用ExternalProject_Add(
jpeg
STAMP_DIR ${CMAKE_BINARY_DIR}/externals/jpeg-pre
BINARY_DIR ${CMAKE_BINARY_DIR}/externals/jpeg-${JPEG_VERSION}
URL ${JPEG_URI}
URL_MD5 <md5_hash_of_downloaded_file>
SOURCE_DIR ${JPEG_DIR}
DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tarballs
CMAKE_ARGS ""
UPDATE_COMMAND cmake -E copy_directory ${EXTERNALS_DIR}/jpeg-${JPEG_VERSION}-overlay/. ${JPEG_DIR}
INSTALL_COMMAND ""
TEST_COMMAND ""
)
转换实现外部联接。 DataStream.coGroup()
接收两个迭代器(每个输入一个),它为某个键的所有元素提供服务,如果没有找到匹配的元素,则可能为空。这允许实现外连接功能。
可以在Flink的下一个版本中的DataStream API中添加对外连接的一流支持。我目前还不知道有任何此类努力。但是,在Apache Flink JIRA中创建问题可能有所帮助。
答案 1 :(得分:0)
一种方法是使用以下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<Tuple2<Boolean, Row>> retractStream = tableEnv.toRetractStream(fullOuterResult, Row.class);