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