2017-09-24 4 views
-1

GoogleデータフローCoGbkResultを使用して2つのテーブルを内部結合として結合しています。Google Dataflow内部結合はリスト内の結合を与えます[]

テーブルに正常に参加することができました。 出力をテキストファイルに書き出していて、結合を確認できました。しかし、結合は一致する結果をリストに入れます。

このようなものです。

301%103%203%2017-09-20 07:49:46[2%google, 3%google, 1%microsoft] 
301%105%200%2017-09-17 11:48:59[2%google, 3%google, 1%microsoft] 

301%103%203%2017-09-20 07:49:46はtable_1からです。 2%google3%google1%microsoftは、表2の結合の結果と一致しています。私は私が一列に出力を得ることができるか疑問

public void processElement(ProcessContext c) { 
    KV<String, CoGbkResult> e = c.element(); 
    String Ad_ID = e.getKey(); 
    Iterable<String> Ad_Info = null; 
    Ad_Info = e.getValue().getAll(AdInfoTag); 
    for (String ImpressionInfo : c.element().getValue().getAll(ImpressionInfoTag)) { 
    // Generate a string that combines information from both collection values 
    c.output(KV.of(Ad_ID, "%" + ImpressionInfo + Ad_Info)); 
    } 
} 

:後

は私processElement方法です。例:

301%103%203%2017-09-20 07:49:46 2%google 
01%103%203%2017-09-20 07:49:46 3%google 
01%103%203%2017-09-20 07:49:46 1%microsoft 
301%105%200%2017-09-17 11:48:59 2%google 1%microsoft 
301%105%200%2017-09-17 11:48:59 3%google 
301%105%200%2017-09-17 11:48:59 1%microsoft 
+0

出力のフォーマット方法を完全には明確にしていません。特に、あなたの例では、接頭辞 "301%105%200%2017-09-17 11:48:59"を持つ3つの異なる行があり、そのうちの1行には "2%google"と "1%microsoft"ライン上に。それは意図的なのでしょうか? –

+0

@Ben Chambers ...これは、別々の解析を行うときに機能します。問題は、私はtoString – KosiB

答えて

0

私はこれをパーサーで取得できました。 GCPデータフローでは、このための方法が用意されていますか?

int jointbegin = outputstring.indexOf( "["); 文字列firsthalf =出力文字列string(0、jointbegin); 文字列secondhalf = outputstring.substring(outputstring.indexOf( "[")+ 1、outputstring.indexOf( "]"));

  if (!secondhalf.isEmpty()) 
      { 
       String[] ad_data = secondhalf.split(","); 

       for (int i = 0; i < ad_data.length; i++) 
       { 
        String final_string = firsthalf + ad_data[i]; 
        c.output(final_string); 
       } 
      } 
      } 
+0

に切り替えましたあなたの質問のDoFnでは、反復可能なAd_InfoのtoString()を呼び出していましたが、今度はそれを解析して個々のコンポーネントを抽出しています - なぜAdInfoをオリジナルのDoFnは既にコンポーネントを含んでいますか? – jkff

+0

@jkff。これはあなたが言ったように働いています。 – KosiB

+0

ええ、上のベンの答えは、これを正しい方法で正確に説明しています。 – jkff

1

あなたが出力したいかについての私の理解では(一部推測)あなたは第1および第2の両方の反復可能で、すべてのエントリの出力に行をしたいということですが、私はなぜあなただ​​けではなく、できることを確認してないんだけどiterableを文字列に変換して解析するのではなく、2つのforループを使用します。例:

public void processElement(ProcessContext c) { 
    KV<String, CoGbkResult> e = c.element(); 
    String Ad_ID = e.getKey(); 
    Iterable<String> Ad_Infos = e.getValue().getAll(AdInfoTag); 
    for (String ImpressionInfo : c.element().getValue().getAll(ImpressionInfoTag)) { 
    for (String Ad_Info : Ad_Infos) { 
     c.output(KV.of(Ad_ID, "%" + ImpressionInfo + Ad_Info)); 
    } 
    } 
}