簡體   English   中英

如何在 Apache Beam 中一起使用 MapElements 和 KV?

[英]How do I use MapElements and KV in together in Apache Beam?

我想做類似的事情:

PCollection<String> a = whatever;
PCollection<KV<String, User>> b = a.apply(
        MapElements.into(TypeDescriptor.of(KV<String, User>.class))
        .via(s -> KV.of(s, new User(s))));

其中 User 是帶有 Arvo 編碼器和考慮字符串的構造函數的自定義數據類型。

但是,我收到以下錯誤:

無法從參數化類型中選擇

我試圖將其更改為TypeDescriptor.of(KV.class) ,但隨后我得到:

不兼容的類型; 必需的 PCollection> 但“應用”被推斷為 OutputT:不存在類型變量的實例,因此 PCollection 符合 PCollection>

那么我應該如何將KVMapElements一起使用?

我知道我想要做的是使用ParDo是可行的,我可以通過清除new DoFn<String, KV<String, User>>來明確指定如何執行類型擦除,但ParDo不支持 lambda 函數。 當我們使用 Java 8 時,這似乎不太優雅......

由於Java在編譯期間的類型擦除KV<String, User>.class被轉換為KV.class並且在運行時KV.class沒有足夠的信息來推斷編碼器,因為類型變量已被擦除。

要解決此限制,您需要使用一種在編譯后保留類型信息的機制。 例如,您可以使用:

TypeDescriptors.kvs(TypeDescriptors.strings(), TypeDescriptor.of(User.class))

這與提供您自己的匿名類相同:

new TypeDescriptor<KV<String, User>> {}

提供綁定類型變量的匿名類是當前在 Java 中繞過類型擦除的方法之一。

嘗試使用 SimpleFunction - 它保留類型信息

暫無
暫無

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

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