簡體   English   中英

Apache Flink 將 DataStream(源)轉換為 List?

[英]Apache Flink transform DataStream (source) to a List?

我的問題是如何從DataStream轉換為List ,例如為了能夠遍歷它。

代碼如下所示:

package flinkoracle;

//imports
//....

public class FlinkOracle {

    final static Logger LOG = LoggerFactory.getLogger(FlinkOracle.class);

    public static void main(String[] args) {
        LOG.info("Starting...");
        // get the execution environment
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        TypeInformation[] fieldTypes = new TypeInformation[]{BasicTypeInfo.STRING_TYPE_INFO,
            BasicTypeInfo.STRING_TYPE_INFO,
            BasicTypeInfo.STRING_TYPE_INFO,
            BasicTypeInfo.STRING_TYPE_INFO};

        RowTypeInfo rowTypeInfo = new RowTypeInfo(fieldTypes);
        //get the source from Oracle DB
        DataStream<?> source = env
                .createInput(JDBCInputFormat.buildJDBCInputFormat()
                        .setDrivername("oracle.jdbc.driver.OracleDriver")
                        .setDBUrl("jdbc:oracle:thin:@localhost:1521")
                        .setUsername("user")
                        .setPassword("password")
                        .setQuery("select * from  table1")
                        .setRowTypeInfo(rowTypeInfo)
                        .finish());

        source.print().setParallelism(1);

        try {
            LOG.info("----------BEGIN----------");
            env.execute();
            LOG.info("----------END----------");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        LOG.info("End...");
    }

}

提前非常感謝。 兄弟塔馬斯

Flink提供了一個迭代器接收器來收集DataStream結果以進行測試和調試。 可以如下使用:

import org.apache.flink.contrib.streaming.DataStreamUtils;

DataStream<Tuple2<String, Integer>> myResult = ...
Iterator<Tuple2<String, Integer>> myOutput = DataStreamUtils.collect(myResult)

您可以將迭代器復制到新列表,如下所示:

while (iter.hasNext())
    list.add(iter.next());

Flink在DataStream上還提供了一堆簡單的write *()方法,這些方法主要用於調試目的。 刷新到目標系統的數據取決於OutputFormat的實現。 這意味着並非所有發送到OutputFormat的元素都會立即顯示在目標系統中。 注意:這些write *()方法不參與Flink的檢查點,並且在失敗的情況下,這些記錄可能會丟失。

writeAsText() / TextOutputFormat
writeAsCsv(...) / CsvOutputFormat
print() / printToErr()
writeUsingOutputFormat() / FileOutputFormat
writeToSocket

來源: link

您可能需要添加以下依賴項才能使用DataStreamUtils:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-contrib</artifactId>
    <version>0.10.2</version>
</dependency>

在較新的版本中, DataStreamUtils::collect已被棄用。 相反,您可以使用DataStream::executeAndCollect如果給定一個限制,它將返回一個最多該大小的List

var list = source.executeAndCollect(100);

如果您不知道有多少元素,或者您只是想遍歷結果而不一次將它們全部加載到 memory 中,那么您可以使用無參數版本來獲取 a 以獲取CloseableIterator

try (var iterator = source.executeAndCollect()) {
  // do something
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM