Google bigquery 是否有任何表单可以写入BigQuery,动态指定目标表的名称?

Google bigquery 是否有任何表单可以写入BigQuery,动态指定目标表的名称?,google-bigquery,google-cloud-dataflow,Google Bigquery,Google Cloud Dataflow,是否有任何表单可以写入BigQuery,动态指定目标表的名称 现在我有: bigQueryRQ .apply(BigQueryIO.Write .named("Write") .to("project_name:dataset_name.table_name") .withSchema(Table.create_auditedTableSchema()) .withCreateDisposition(BigQueryIO.Write.CreateDispositi

是否有任何表单可以写入BigQuery,动态指定目标表的名称

现在我有:

bigQueryRQ
.apply(BigQueryIO.Write
    .named("Write")
    .to("project_name:dataset_name.table_name")
    .withSchema(Table.create_auditedTableSchema())
    .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
    .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND));

但是我需要表名作为动态表名,它取决于我要写入的tablerow数据。

不幸的是,我们没有提供API来以数据相关的方式命名BigQuery表。一般来说,依赖数据的BigQuery表目标可能容易出错


尽管如此,我们正在努力提高这一领域的灵活性。目前还没有估计,但我们希望很快就能得到。

不幸的是,我们没有提供API来以依赖数据的方式命名BigQuery表。一般来说,依赖数据的BigQuery表目标可能容易出错

尽管如此,我们正在努力提高这一领域的灵活性。目前没有估计,但我们希望很快就能得到。我也有同样的问题。 如何分组行,并应用BigQueryIO。分别为每个组编写

    public static class TagMarker extends DoFn<TableRow, TableRow> {

    private Map<String, TupleTag<TableRow>> tagMap;

    public TagMarker(Map<String, TupleTag<TableRow>> tagMap) {
        this.tagMap = tagMap;
    }

    @Override
    public void processElement(ProcessContext c) throws Exception {
        TableRow item = c.element();
        c.sideOutput(tagMap.get(getTagName(item)), item);
    }

    private String getTagName(TableRow row) {
        // There will be your logic of determinate table by row
        return "table" + ((String)row.get("msg")).substring(0, 1);
    }

}


private static class GbqWriter extends PTransform<PCollection<TableRow>, PDone> {

    @Override
    public PDone apply(PCollection<TableRow> input) {

        TupleTag<TableRow> mainTag = new TupleTag<TableRow>();
        TupleTag<TableRow> tag2 = new TupleTag<TableRow>();
        TupleTag<TableRow> tag3 = new TupleTag<TableRow>();

        Map<String, TupleTag<TableRow>> tagMap = new HashMap<String, TupleTag<TableRow>>();
        tagMap.put("table1", mainTag);
        tagMap.put("table2", tag2);
        tagMap.put("table3", tag3);

        List<TupleTag<?>> tags = new ArrayList<TupleTag<?>>();
        tags.add(tag2);
        tags.add(tag3);

        PCollectionTuple result = input.apply(
            ParDo.withOutputTags(mainTag, TupleTagList.of(tags)).of(new TagMarker(tagMap))
        );

        PDone done = null;
        for (String tableId : tagMap.keySet()) {
            done = writeToGbq(tableId, result.get(tagMap.get(tableId)).setCoder(TableRowJsonCoder.of()));
        }

        return done;
    }


    private PDone writeToGbq(String tableId, PCollection<TableRow> rows) {

        PDone done = rows
                .apply(BigQueryIO.Write.named("WriteToGbq")
                .to("<project>:<dataset>." + tableId)
                .withSchema(getSchema())
                .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_TRUNCATE)
        );

        return done;
    }

}
我不确定重写变量是否完成。对吗?失败后能否将制动器重写为GBQ

只有在解析行之前知道要写入的表列表时,这种方法才适用。

我也有同样的问题。 如何分组行,并应用BigQueryIO。分别为每个组编写

    public static class TagMarker extends DoFn<TableRow, TableRow> {

    private Map<String, TupleTag<TableRow>> tagMap;

    public TagMarker(Map<String, TupleTag<TableRow>> tagMap) {
        this.tagMap = tagMap;
    }

    @Override
    public void processElement(ProcessContext c) throws Exception {
        TableRow item = c.element();
        c.sideOutput(tagMap.get(getTagName(item)), item);
    }

    private String getTagName(TableRow row) {
        // There will be your logic of determinate table by row
        return "table" + ((String)row.get("msg")).substring(0, 1);
    }

}


private static class GbqWriter extends PTransform<PCollection<TableRow>, PDone> {

    @Override
    public PDone apply(PCollection<TableRow> input) {

        TupleTag<TableRow> mainTag = new TupleTag<TableRow>();
        TupleTag<TableRow> tag2 = new TupleTag<TableRow>();
        TupleTag<TableRow> tag3 = new TupleTag<TableRow>();

        Map<String, TupleTag<TableRow>> tagMap = new HashMap<String, TupleTag<TableRow>>();
        tagMap.put("table1", mainTag);
        tagMap.put("table2", tag2);
        tagMap.put("table3", tag3);

        List<TupleTag<?>> tags = new ArrayList<TupleTag<?>>();
        tags.add(tag2);
        tags.add(tag3);

        PCollectionTuple result = input.apply(
            ParDo.withOutputTags(mainTag, TupleTagList.of(tags)).of(new TagMarker(tagMap))
        );

        PDone done = null;
        for (String tableId : tagMap.keySet()) {
            done = writeToGbq(tableId, result.get(tagMap.get(tableId)).setCoder(TableRowJsonCoder.of()));
        }

        return done;
    }


    private PDone writeToGbq(String tableId, PCollection<TableRow> rows) {

        PDone done = rows
                .apply(BigQueryIO.Write.named("WriteToGbq")
                .to("<project>:<dataset>." + tableId)
                .withSchema(getSchema())
                .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_TRUNCATE)
        );

        return done;
    }

}
我不确定重写变量是否完成。对吗?失败后能否将制动器重写为GBQ


只有当您知道在解析行之前要写入的表列表时,这种方法才适用。

当然-数据可以任意分区,并且这些分区可以写入不同的表。但是,这些表的名称仍然不能依赖于数据。它们仍然是在管道构建时,在读取任何数据之前确定的。当然,数据可以任意分区,并且这些分区可以写入不同的表。但是,这些表的名称仍然不能依赖于数据。它们仍然是在管道施工时,在读取任何数据之前确定的。不,还没有。这被追踪为。您可能希望观看该问题,以自动获得更改通知。不,还没有。这被追踪为。您可能希望观察该问题,以自动获得更改通知。