通过 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
我已经使用 value
的 FLOAT
类型按照建议 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 没有变化。
如前所述,我不知道这是否会解决我与原始项目的问题,但希望这对下一个人有所帮助。
我正在尝试通过带有日期分区的 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
我已经使用 value
的 FLOAT
类型按照建议 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 没有变化。
如前所述,我不知道这是否会解决我与原始项目的问题,但希望这对下一个人有所帮助。