【问题标题】:How to Add a Column to BigQuery External Table如何向 BigQuery 外部表添加列
【发布时间】:2021-04-11 17:50:37
【问题描述】:

我有一堆数据存储在 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。当然,在现实中,我有大量文件,我宁愿不必重新创建所有旧文件。我需要一种方法让外部表看到旧条目为 NULLS 的“D 列”以及新文件中的正确值。

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

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

【问题讨论】:

    标签: google-bigquery google-cloud-storage


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢! “编辑架构”按钮被滚动到视图之外,因此并不明显。但你是对的,如果你去寻找它,它就在那里。我会把这当作胜利。我可以在窗口上向下滚动以避免数据重新加载,没问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多