簡體   English   中英

在Apache Beam中聯接行

[英]Joining rows in Apache Beam

我無法理解Apache Beam中的聯接(例如http://www.waitingforcode.com/apache-beam/joins-apache-beam/read )是否可以聯接整行。

例如:

我有2個CSV格式的數據集,其中第一行是列標題。

首先:

a,b,c,d
1,2,3,4
5,6,7,8
1,2,5,4

第二:

c,d,e,f
3,4,9,10

我想在c和d列上保留連接,以便最終得到:

a,b,c,d,e,f
1,2,3,4,9,10
5,6,7,8,,
1,2,5,4,,

但是,Apache Beam上的所有文檔似乎都說加入時PCollection對象的類型必須為KV<K, V> ,因此我將PCollection對象分解為KV<String, String>對象的集合(其中的鍵是列標題,而值是行值)。 但是在那種情況下(您只有一個帶有值的鍵)我看不到如何保持行格式。 KV(c,7)如何“知道” KV(a,5)來自同一行? Join根本就是用於這種事情嗎?

到目前為止,我的代碼:

PCollection<KV<String, String>> flightOutput = ...;
PCollection<KV<String, String>> arrivalWeatherDataForJoin = ...;
PCollection<KV<String, KV<String, String>>> output = Join.leftOuterJoin(flightOutput, arrivalWeatherDataForJoin, "");

是的, Join是實用程序類,可幫助您進行類似的聯接。 它是CoGropByKey的包裝,請參閱文檔中的相應部分 它的實現很短 它的測試可能還會有一些有用的示例。

您的問題很可能是由您如何選擇鍵引起的。

Join庫中的KeyT int KV<KeyT,V1>表示您用於匹配記錄的鍵,它包含所有連接字段。 因此,在您的情況下,您可能需要分配類似以下的鍵(偽代碼):

pCollection1:

    Key     Value
   (3,4)  (1,2,3,4)
   (7,8)  (5,6,7,8)
   (5,4)  (1,2,5,4)

pCollection2:

    Key     Value
   (3,4)  (3,4,9,10)

聯接的結果將如下所示(偽代碼):

joinResultPCollection:

   Key              Value
  (3,4)      (1,2,3,4),(3,4,9,10)
  (7,8)      (5,6,7,8),nullValue
  (5,4)      (1,2,5,4),nullValue

因此,您可能需要在連接后添加另一個轉換,以將左側和右側實際合並到合並的行中。

因為您有CSV,所以您可能可以使用"3,4"類的實際字符串作為鍵(和值)。 或者,您可以使用Lists<>或自定義行類型。

例如,這正是Beam SQL Join實現的功能。

暫無
暫無

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

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