Java Google Dataflow内部联接在列表中提供联接[]

Java Google Dataflow内部联接在列表中提供联接[],java,google-cloud-platform,google-cloud-dataflow,Java,Google Cloud Platform,Google Cloud Dataflow,我正在使用google数据流结果将两个表作为内部联接进行联接 我成功地加入了这个团队。 我正在将输出写入文本文件,并且能够验证连接。但是,联接会将匹配结果放入列表中 像这样的 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

我正在使用google数据流结果将两个表作为内部联接进行联接

我成功地加入了这个团队。 我正在将输出写入文本文件,并且能够验证连接。但是,联接会将匹配结果放入列表中

像这样的

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
来自表1
2%google
3%google
1%microsoft
都是表2中加入的匹配结果

以下是我的
processElement
方法:

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));
  }
}

我设法通过一个解析器得到了这个。 然而,GCP数据流是否为此提供了一种方法

int jointbegin=outputstring.indexOf(“[”); String firsthalf=outputstring.substring(0,jointbegin); String secondhalf=outputstring.substring(outputstring.indexOf(“[”)+1,outputstring.indexOf(“])

if(!secondhalf.isEmpty())
{
字符串[]ad_data=secondhalf.split(“,”);
对于(int i=0;i
我对要输出的内容的理解(部分猜测)是希望为第一个和第二个iterable中的每个条目输出一行,但我不确定为什么不能只使用两个for循环,而不是将iterable转换为字符串,然后对其进行解析。例如:

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));
    }
  }
}
public void processElement(ProcessContext c){
KV e=c.元件();
字符串Ad_ID=e.getKey();
Iterable Ad_Infos=e.getValue().getAll(AdInfoTag);
for(字符串ImpressionInfo:c.element().getValue().getAll(ImpressionInfo标记)){
对于(字符串Ad_Info:Ad_Infos){
c、 输出(千伏(Ad_ID,“%”+印象信息+Ad_信息));
}
}
}

在问题的DoFn中,您(隐式地)调用了toString()在iterable Ad_信息上,现在您正在解析它以提取单个组件-为什么不在原始DoFn中迭代AdInfo,因为它已经包含了组件?是的,Ben上面的回答准确地描述了如何以正确的方式进行此操作。还不完全清楚您希望如何格式化输出。具体地说,在您的示例中这里有3行前缀为“301%105%200%2017-09-17 11:48:59”,其中一行的行上同时有“2%google”和“1%microsoft”。这是故意的吗?@Ben Chambers…当我进行单独解析时,这是有效的。问题是我切换到了toString
            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);
                }
            }
          }
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));
    }
  }
}