光束-读取AVRO并进行变换

时间:2018-12-12 00:06:23

标签: google-cloud-dataflow apache-beam bigtable

我必须从Cloud Storage中读取一个AVRO文件,然后使用行键将记录写入一个大表中,并将AVRO作为列单元格中的字节写入..我正在使用AVROIO.read以GenericRecord的形式读取数据。 。如何应用pardo函数将数据转换为可以写入bigtable的数据

// Read AVRO from GCS

pipeline
  .apply("Read from Avro",
    AvroIO
       .readGenericRecords(schema)
       .from(options.getInputFilePattern()))

//.apply - pardo transformation 

.apply("Write to Bigtable", write);

真的很感谢管道中第二步的任何帮助

更新:

感谢安东(Anton)的快速帮助,我现在明白了我的工作,并提出了以下关于pardo的建议

 pipeline
   .apply("Read from Avro",
               AvroIO
                 .readGenericRecords(schema)
                 .from(options.getInputFilePattern()))
   .apply(ParDo.of(new DoFn<GenericRecord,  Iterable<Mutation> >() {
       @ProcessElement
       public void processElement(ProcessContext c) {
            GenericRecord gen = c.element();
            byte[] fieldNameByte = null;
            byte[] fieldValueByte = null;

            // ImmutableList.Builder<Mutation> mutations = ImmutableList.builder();
            for (Schema.Field field : fields) {

                try {
                   String fieldName = field.name();
                   fieldNameByte = fieldName.getBytes("UTF-8");
                   String value = String.valueOf(gen.get(fieldName));
                   fieldValueByte = value.getBytes("UTF-8");
                } catch (Exception e) {
                   e.printStackTrace();
                }

                Iterable<Mutation> mutations =
                  ImmutableList.of(
                     Mutation.newBuilder()
                         .setSetCell(
                           Mutation.SetCell.newBuilder()
                              .setValue(
                                   ByteString.copyFrom(fieldValueByte))
                               .setFamilyName(COLUMN_FAMILY_NAME))
                         .build());
                c.output(,mutations));
              }
          }
       }))
   .apply("Write to Bigtable", write);
 return pipeline.run();

这只是一个伪代码,我正在学习并尝试..我需要在将变异添加到ProcessContext并进行写操作时需要帮助。请看一下,并让我知道我的方向是否正确以及如何将变异添加到上下文中

1 个答案:

答案 0 :(得分:1)

遵循以下原则:

Pipeline p = Pipeline.create(options);
p.apply(GenerateSequence.from(0).to(numRows))
 .apply(
     ParDo.of(new DoFn<Long, KV<ByteString, Iterable<Mutation>>>() {
         @ProcessElement
         public void processElement(ProcessContext c) {
             int index = c.element().intValue();

             Iterable<Mutation> mutations =
                ImmutableList.of(
                   Mutation.newBuilder()
                           .setSetCell(Mutation.SetCell.newBuilder()
                           .setValue(testData.get(index).getValue())
                           .setFamilyName(COLUMN_FAMILY_NAME))
                           .build());
             c.output(KV.of(testData.get(index).getKey(), mutations));
         }
     }))
 .apply(
    BigtableIO
      .write()
      .withBigtableOptions(bigtableOptions)
      .withTableId(tableId));

Bigtable integration test复制。

一般来说,here is还会在ParDo上发布文档,对于BigtableIO来说,here's javadoc也有一些解释。