通过 CLI 从 Bucket 将 AVRO 加载到带有日期分区的 BigQuery

Loading AVRO from Bucket via CLI into BigQuery with Date partition

我正在尝试通过带有日期分区的 AVRO 将数据导入 BigQuery。通过 cli 导入时,与分区日期相关的错误必须是日期或时间戳,但它得到的是整数。

给定一个类似于以下文件的 AVRO 文件:

{
  "namespace": "test_namespace",
  "name": "test_name",
  "type": "record",
  "fields": [
    { 
      "name": "partition_date",
      "type": "int",
      "logicalType": "date"
    },
    {
      "name": "unique_id",
      "type": "string"
    },
    {
      "name": "value",
      "type": "double"
    }
}

然后我通过 CLI 使用以下命令尝试创建一个新的 table

bg load \
--replace \
--source_format=AVRO \
--use_avro_logical_types=True \
--time_partitioning_field partition_date \
--clustering_fields unique_id \
mydataset.mytable \
gs://mybucket/mydata.avro

预期是一个新的 table 在日期列 "partition_date" 上分区,然后按 "unique_id" 聚类。

编辑:请看下面的错误

The field specified for the time partition can only be of type TIMESTAMP or DATE. The type found is: INTEGER.

我使用的确切命令如下:

bq load --replace --source_format=AVRO --use_avro_logical_types=True --time_partitioning_field "partition_date" --clustering_fields "unique_id" BQ_DATASET BUCKET_URI

这是我正在使用的 AVRO 模式

{
    "namespace": "example.avro",
    "type": "record",
    "name": "Test",
    "fields": [
        { "name": "partition_date", "type": "int", "logicalType": "date" },
        { "name": "unique_id", "type": "string"},
        { "name": "value", "type": "float" }
   ]
}

值得注意的是,如果有任何相关性的话,这是一个旧的 Google 项目(大约 2 - 3 岁)。

我也在使用最新的 Google SDK windows 10。

在执行相同的加载操作、生成相同的 AVRO 数据模式并使用所需的大数据接收器 table 结构时,我没有收到任何错误消息。

根据 GCP documentation you've used --use_avro_logical_types=True flag along bq command-line properly propagating conversion data types, keeping DATA Avro logical type be translated to the equivalent Date 输入 Bigquery。

您可以参考我的 Bigquery table 架构,在您这边验证 table 结构,因为您没有提供 table 结构和错误消息本身 我不能建议到目前为止:

$ bq show --project_id=<Project_ID>  <Dataset>.<Table>
Table <Project_ID>:<Dataset>.<Table>

   Last modified            Schema            Total Rows   Total Bytes   Expiration        Time Partitioning        Clustered Fields   Labels
 ----------------- ------------------------- ------------ ------------- ------------ ----------------------------- ------------------ --------
  22 Apr 12:03:57   |- partition_date: date   3            66                         DAY (field: partition_date)   unique_id
                    |- unique_id: string
                    |- value: float

我已经使用 valueFLOAT 类型按照建议 here 简单地转换 AVRO DOUBLE 数据类型。

bq CLI 版本:

$ bq version
This is BigQuery CLI 2.0.56

随时使用有关您遇到的问题的更具体信息来扩展原始问题,进一步帮助更准确地解决问题。

更新:

我已经检查了提供的信息,但我仍然对您遇到的错误感到困惑。显然我看到在你的情况下 flag use_avro_logical_types=True 不执行逻辑类型转换。但是我发现了这个 PIT 功能 request where people are asking to "whitelist" their projects in order to afford AVRO logicaltype functionality, i.e. this comment。由于此功能已推广到全球社区,可能是疏忽导致某些 GCP 项目无法使用它。

Google 终于回到我身边(7 个月后)。在这段时间里,我无法再访问遇到问题的初始项目。但是,我正在为那些后来在新项目中发现这一点的人记录一个成功的例子。

根据问题跟踪器 here 的评论,我发现我没有为逻辑日期字段使用复杂类型。

所以这个:

{ 
  "name": "partition_date",
  "type": "int",
  "logicalType": "date"
}

应该这样写(注意type的嵌套复杂对象):

{ 
  "name": "partition_date",
  "type": {
    "type": "int",
    "logicalType": "date"
  }
}

虽然 avro specification 列出了一个日期作为从 unix 纪元(1970 年 1 月 1 日)开始的天数,但我不得不将 partition_date 写成 datetime.date(1970, 1, 1) 而不是 0.

命令 (bq) 与原来的 post 没有变化。

如前所述,我不知道这是否会解决我与原始项目的问题,但希望这对下一个人有所帮助。