使用 Avro 将具有多列的行插入 BigQuery
Inserting rows with multiple columns into BigQuery using Avro
我在使用 Avro 作为导入格式创建简单 table 时遇到问题。我想创建一个带有 N 列原始数据类型的典型 table,例如带有列 c1 STRING
和 c2 INTEGER
.
的 table
我使用这样的模式
{
"type": "record",
"name": "x",
"fields": [
{
"name": "c1",
"type": "string"
},
{
"name": "c2",
"type": "int"
}
]
}
这导致一列的名称为 root
,类型为 RECORD
,其中嵌套了 c1
和 c2
。
如何使用 Avro 导入到具有两列 c1
和 c2
的 table?或者目前是否可以只创建具有固定名称 root
的一列的 table?
我尝试了其他方法:
- Avro 类型
array
(属于 string
)创建一列,名称为 root
,类型为 STRING REPEATED
- 像
{"type":"string"}
这样的最简单的模式创建一个名称为 root
且类型为 STRING
的列。这种方法不允许创建多个列,也不允许更改列的名称。
感谢您的反馈。 Avro schema 总是以一个未命名的列开始,它可以是像字符串这样的原始类型,也可以是像记录这样的复杂类型。我们现在将它映射到 BQ 中的一个列并将名称固定为 "root"。如果这成为一个常见的请求,我们将考虑在根级别对封闭记录进行条带化。但是我们处理记录类型的方式与其他类型不同。
现在的解决方案是用查询剥离根记录并保存到另一个table。或者,您可以通过 federated tables:
一步合并加载和剥离
bq 查询 --external_table_definition=foo::AVRO=gs://your_bucket/path/file.avro* --destination_table your_dataset.your_table "SELECT root.* FROM foo"
我在使用 Avro 作为导入格式创建简单 table 时遇到问题。我想创建一个带有 N 列原始数据类型的典型 table,例如带有列 c1 STRING
和 c2 INTEGER
.
我使用这样的模式
{
"type": "record",
"name": "x",
"fields": [
{
"name": "c1",
"type": "string"
},
{
"name": "c2",
"type": "int"
}
]
}
这导致一列的名称为 root
,类型为 RECORD
,其中嵌套了 c1
和 c2
。
如何使用 Avro 导入到具有两列 c1
和 c2
的 table?或者目前是否可以只创建具有固定名称 root
的一列的 table?
我尝试了其他方法:
- Avro 类型
array
(属于string
)创建一列,名称为root
,类型为STRING REPEATED
- 像
{"type":"string"}
这样的最简单的模式创建一个名称为root
且类型为STRING
的列。这种方法不允许创建多个列,也不允许更改列的名称。
感谢您的反馈。 Avro schema 总是以一个未命名的列开始,它可以是像字符串这样的原始类型,也可以是像记录这样的复杂类型。我们现在将它映射到 BQ 中的一个列并将名称固定为 "root"。如果这成为一个常见的请求,我们将考虑在根级别对封闭记录进行条带化。但是我们处理记录类型的方式与其他类型不同。
现在的解决方案是用查询剥离根记录并保存到另一个table。或者,您可以通过 federated tables:
一步合并加载和剥离bq 查询 --external_table_definition=foo::AVRO=gs://your_bucket/path/file.avro* --destination_table your_dataset.your_table "SELECT root.* FROM foo"