如何在谷歌云数据流管道中传递动态参数

时间:2018-06-06 16:54:47

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

我编写了代码,使用硬编码的ProjectID,数据集,表格名称,GCS Temp&分期位置。

我正在寻找应该阅读的代码

  • 专案编号
  • 数据集
  • 表名
  • GCS Temp&暂存位置参数

来自BigQuery table(Dynamic parameters)

代码: -

public class DemoPipeline {

public static TableReference getGCDSTableReference() {
    TableReference ref = new TableReference();
    ref.setProjectId("myprojectbq");
    ref.setDatasetId("DS_Emp");
    ref.setTableId("emp");
    return ref;
}
static class TransformToTable extends DoFn<String, TableRow> {
    @ProcessElement
    public void processElement(ProcessContext c) {

        String input = c.element();

        String[] s = input.split(",");
        TableRow row = new TableRow();

        row.set("id", s[0]);
        row.set("name", s[1]);
        c.output(row);

    }
}
public interface MyOptions extends PipelineOptions {

    /*
     * Param
     * 
     */

}

public static void main(String[] args) {

    MyOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(MyOptions.class);
    options.setTempLocation("gs://demo-xxxxxx/temp");
    Pipeline p = Pipeline.create(options);

    PCollection<String> lines = p.apply("Read From Storage", TextIO.read().from("gs://demo-xxxxxx/student.csv"));

    PCollection<TableRow> rows = lines.apply("Transform To Table",ParDo.of(new TransformToTable()));

    rows.apply("Write To Table",BigQueryIO.writeTableRows().to(getGCDSTableReference())
            //.withSchema(BQTableSemantics.getGCDSTableSchema())
            .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
            .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_NEVER));

    p.run();
}
}

1 个答案:

答案 0 :(得分:0)

即使要从包含其他数据的初始表(项目ID /数据集/表名称)中读取信息,也需要将此类信息硬编码到某个地方。 Haris建议使用属性文件是一种好方法,请查看以下建议:

  1. Java Properties file。当必须更改或调整参数时使用。通常,不需要新编译的更改。这是一个必须存在或附加到您的Java类的文件。从GCS读取此文件是可行的,但是很奇怪。

  2. 管道执行参数。自定义参数可以解决您的问题,请检查Creating Custom Options以了解如何实现here is a small example