我必须从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并进行写操作时需要帮助。请看一下,并让我知道我的方向是否正确以及如何将变异添加到上下文中
答案 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));
一般来说,here is还会在ParDo
上发布文档,对于BigtableIO
来说,here's javadoc也有一些解释。