如何取消嵌套数据流中的嵌套PCollection

时间:2019-04-05 16:36:22

标签: google-cloud-dataflow apache-beam

要加入两个嵌套结构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集合转换为我吗?

1 个答案:

答案 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