微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何向 BigQuery 外部表添加列

如何解决如何向 BigQuery 外部表添加列

我在 Google Cloud Storage 的分区 ORC 文件中存储了大量数据。我的存储桶如下所示:

my_bucket
- folder_of_orc_files
- - partition1=abc
- - - file1.orc
- - - file2.orc

我在 BigQuery 中定义了一个外部表,指向上面创建的数据:

CREATE OR REPLACE EXTERNAL TABLE my_dataset.my_external_table
WITH PARTITION COLUMNS (
  partition1 STRING,)
OPTIONS (
  uris=['gs://my_bucket/folder_of_orc_files/*'],format=orc,hive_partition_uri_prefix='gs://my_bucket/folder_of_orc_files'
);

这些文件当前包含“A 列”、“B 列”和“C 列”列。

现在我需要添加“D列”。所以我添加一个包含“D 列”的 file3.orc。实际上,当然,我有大量的文件,我宁愿不必重新创建所有旧文件。我需要一种方法,让外部表看到“D 列”,旧条目为 NULL,并使用新文件中的正确值。

出了门,外部表没有看到“D列”。所以我删除了表格并重新添加了它。它仍然只有 A、B 和 C 列,并且完全忽略了“D 列”。对于 ORC 文件,您无法指定架构 - 它会自动读取它。 ALTER TABLE 命令不适用于外部表。

我发现的唯一一件事(除了从我的 Spark 作业从头开始重新加载所有数据)是我可以将所有数据移动到临时表中,然后将它们重新写出 - 这又是一个相当大的问题当您拥有大量数据时,大型任务(且昂贵)。任何人都知道任何其他方式来实现这一目标?谢谢!

解决方法

当您要求 BigQuery 执行架构自动检测时,BigQuery 只需获取行示例(适用于 CSV 或 JSON 格式)。对于二进制文件,比如ORC格式,我猜是文件样本,还是第一个get。

无论如何,在架构定义之后,架构永远不会自动更新。如果您更改格式,则必须手动更新。

确实,您无法使用 ALTER TABLE 语句来执行此操作,但您可以在 UI 上或使用 bq CLI(或 API/客户端库,如果您愿意)来执行此操作。您有文档 here

所以,不是不可能,但不是自动的!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。