Flink:DataStream上没有外连接?

时间:2016-07-09 20:34:36

标签: apache-flink flink-streaming

我很惊讶地发现Flink(DataStream docs)中DataStream没有外部联接。

对于DataSet,除了常规leftOuterJoinDataSet docs)之外,您还拥有所有选项:rightOuterJoinfullOuterJoinjoin。但是对于DataStream,你只需要普通的旧连接。

这是由于DataStream的一些基本属性导致无法进行外连接吗?或者也许我们可以在(接近?)未来期待这一点?

我真的可以在DataStream上使用外部联接来处理我正在处理的问题......有没有办法实现类似的行为?

2 个答案:

答案 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);