BigqueryIO 无法写入日期分区表

Posted

技术标签:

【中文标题】BigqueryIO 无法写入日期分区表【英文标题】:BigqueryIO Unable to Write to Date-Partitioned Table 【发布时间】:2016-12-22 05:12:32 【问题描述】:

我正在按照以下 post 中的说明写入 BigQuery 中的日期分区表。我正在使用可序列化函数将窗口映射到使用$ 语法的分区位置,我收到以下错误:

Invalid table ID \"table$19700822\". Table IDs must be alphanumeric (plus underscores) and must be at most 1024 characters long.

我错过了什么吗?

编辑添加代码:

p.apply(Window.<TableRow>into(FixedWindows.of(Duration.standardDays(1))))
    .apply(BigQueryIO.Write
    .named("Write")
    .withSchema(schema)
    .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
    .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
    .to(new SerializableFunction<BoundedWindow, String>() 
      public String apply(BoundedWindow window) 
        String dayString = DateTimeFormat.forPattern("yyyyMMdd")
             .withZone(DateTimeZone.UTC)
             .print(((IntervalWindow) window).start());
        return "project_id:dataset.table$" + dayString;
      
    ));

【问题讨论】:

我不这么认为,因为可序列化函数的输出实际上看起来像:project-id:dataset.table$YYYYMMDD 你能提供你正在使用的代码吗? @Sonya 我添加了我正在使用的代码。 【参考方案1】:

确保您尝试访问的表已经存在。您不能在其中创建包含“$”的表,并且您正在使用“如果需要则创建”,因此您的代码除了尝试写入之外,最终可能会创建该表。

【讨论】:

看起来这和使用 DataflowPipelineRunner 的组合解决了这个问题。 @Narek 您是否设法从数据流管道创建了一个带有日期分区的 BQ 表?我有一个流式传输管道,目前我能想到的唯一解决方案是在日期翻转时停止我的管道,然后使用已更新日期的表名启动一个新的流式传输管道。 @PUG 您是否在较新版本中尝试过Write.toTableReference? beam.apache.org/documentation/sdks/javadoc/0.4.0/index.html?org/…

以上是关于BigqueryIO 无法写入日期分区表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dataprep 仅写入日期分区表中的日期分区

使用 DataFlow 作业加载分区表

使用 apache beam 中的 beam.io.gcp.bigquery.WriteToBigQuery 模块写入日期分区的 Bigquery 表

Apache Beam 的 BigQueryIO (Java):无法将 TIMESTAMP 字段写入 BigQuery——fastxml.jackson 异常“类型不支持”

数据框无法在 S3 上写入

无法写入分区 Not Found (android, pixel 3)