要加入两个嵌套结构PCollection,在进行加入之前,我们需要取消PCollection的嵌套,这会带来挑战(请参阅我的其他stackoverflow案例a link)。因此想知道如何取消嵌套PCollection。如果有人提出一个想法,那就是加入两个嵌套表或如何取消嵌套PCollections。
我刚刚注意到,我们有PTransform“ Unnest”(link)用于从嵌套的嵌套对象中取消嵌套集合。但是我在网上找不到任何样本。但是,我只是尝试通过以下步骤来实现它以转换嵌套集合,但仍然无法最后获得不必要的集合。
1)PCollection empCollection = ReadCollection(); 2)使用Pardo函数将值从PCollection(com.google.api.services.bigquery.model.TableRow)转换为PCollection(org.apache.beam.sdk.values.Row) 3)如下定义架构 模式项目= Schema.builder()。addInt32Field(“ Id”)。addStringField(“ Name”)。build(); 架构员工= Schema.builder()。addStringField(“ empNo”)。addStringField(“ empName”)。addArrayField(“ Projects”,FieldType.row(projects))。build(); 4)使用Unnest转换取消嵌套集合的嵌套
PCollection<Row> pcColl = targetRowCollection.apply(Unnest.<Row>create().withFieldNameFunction(new SerializableFunction<java.util.List<java.lang.String>, java.lang.String>() {
@Override
public java.lang.String apply(java.util.List<java.lang.String> input) {
return String.join("+", input);
}
}));
5)使用Pardo函数将值从PCollection(org.apache.beam.sdk.values.Row)转换为PCollection(com.google.api.services.bigquery.model.TableRow)
可以使用此Unnest转换将嵌套集合中的unnest集合转换为我吗?
答案 0 :(得分:0)
使用Beam在python中将两个具有嵌套结构的Pcollection连接起来的代码:
with beam.Pipeline(options=option) as p:
source_record1 = p | "get data1" >> beam.io.avroio.ReadFromAvro(input_file1)
source_record2 = p | "get data2" >> beam.io.avroio.ReadFromAvro(input_file2)
#convert into <k,v> form
keyed_record1 = source_record1 | beam.ParDo(addkeysnested(),join_fileld_names1)
keyed_record2 = source_record2 | beam.ParDo(addkeysnested(),join_fileld_names2)
#Apply join operation
rjoin = ({'File1Info': keyed_record1, 'File2Info': keyed_record2}
| beam.CoGroupByKey())
class addkeysnested(beam.DoFn):
def process(self,element,fieldName):
tmp_record = element
fieldName = fieldName.split(".")
for i in range(len(fieldName)):
if i != len(fieldName) - 1 :
tmp_record = tmp_record[fieldName[i].strip()][0]
else:
tmp_record = tmp_record[fieldName[i].strip()]
return [(tmp_record,element)]
注意:在上面的代码中,我们可以在任何嵌套字段级别(即personalInfo.Address.City)获取键值,然后应用CoGroupByKey()来连接两个pcollection