【问题标题】:Write to a dynamic BigQuery table through Apache Beam通过 Apache Beam 写入动态 BigQuery 表
【发布时间】:2017-12-15 06:37:10
【问题描述】:

我在运行时获取 BigQuery 表名称,并将该名称传递给管道末尾的 BigQueryIO.write 操作以写入该表。

我为它写的代码是:

rows.apply("write to BigQuery", BigQueryIO
    .writeTableRows()
    .withSchema(schema)
    .to("projectID:DatasetID."+tablename)
    .withWriteDisposition(WriteDisposition.WRITE_TRUNCATE)
    .withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED));

使用这种语法我总是会出错,

Exception in thread "main" java.lang.IllegalArgumentException: Table reference is not in [project_id]:[dataset_id].[table_id] format

当我事先不知道应该将数据放入哪个表时,如何以正确的格式传递表名?有什么建议吗?

谢谢

【问题讨论】:

  • 可以有多少个表将数据写入 bigquery?
  • “tableName”字段或变量来自哪里?它是如何定义的?
  • 另外:此错误消息似乎不完整;我相信它应该包括表格规范的实际值。如果不知道传递给 .to() 的确切值,很难帮助您解决此错误 - 错误消息只是说您传递给 .to() 的值格式不正确;它与您在运行时传递它的事实无关。
  • 也许您会发现另一件有用的事情:如果您要写入的表是由数据本身决定的,请参阅此答案stackoverflow.com/a/43505535/278042
  • @BenChambers 我正在做的是,我从 BigQuery 表中的一个字段中获取“tableName”并将其存储在一个字符串变量中......我最终将其传递给BigQueryIO.write() 操作。

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


【解决方案1】:

然而,在这件事上派对已经很晚了。 我怀疑问题是您传递的是字符串而不是表引用。

如果您创建了一个表引用,我怀疑您对上述代码没有任何问题。

com.google.api.services.bigquery.model.TableReference table = new TableReference()
            .setProjectId(projectID)
            .setDatasetId(DatasetID)
            .setTableId(tablename);

rows.apply("write to BigQuery", BigQueryIO
    .writeTableRows()
    .withSchema(schema)
    .to(table)
    .withWriteDisposition(WriteDisposition.WRITE_TRUNCATE)
    .withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED));

【讨论】:

  • 嗨 Campey...是的,但这里的问题是我认为您将无法在 .setTableId(tablename) 中传递 valueProvider。目前,BigQueryIO 直接允许在向 BigQuery 写入时传递 ValueProvider。如果我们拥有整个位置,这将很有用。否则,有诸如动态目的地之类的选项或@jkff 通过他提供的链接stackoverflow.com/a/43505535/278042 推荐的选项。
  • 我是通过动态目的地完成的。稍后会提供解决方案。
猜你喜欢
  • 2020-12-21
  • 2020-03-31
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2021-02-25
  • 1970-01-01
相关资源
最近更新 更多