如何在BigQuery中使用路径重命名列?

时间:2019-05-14 15:10:03

标签: google-bigquery bigdata avro

我正在寻找一种方法来重命名从我的avro模式嵌套的列。我尝试了google在其文档(https://cloud.google.com/bigquery/docs/manually-changing-schemas)上的选项,但是任何时候我尝试将别名或类型转换为嵌套结构都行不通。

例如:

   SELECT
     * EXCEPT(user.name.first, user.name.last),
     user.name.first AS user.name.firstName,
     user.name.last AS user.name.lastName
   FROM
     mydataset.mytable

但是,这不喜欢使用路径别名。我试图避免的另一种选择是将所有以前的avro文件拉入并使用数据流进行转换。我希望有一个比这更优雅的解决方案。谢谢。

2 个答案:

答案 0 :(得分:1)

您需要在每个级别上重建结构。这是一些示例数据的示例:

SELECT
  * REPLACE(
    (SELECT AS STRUCT user.* REPLACE (
       (SELECT AS STRUCT user.name.* EXCEPT (first, last),
          user.name.first AS firstName,
          user.name.last AS lastName
       ) AS name)
    ) AS user)
FROM (
  SELECT
    STRUCT(
      STRUCT('elliott' AS first, '???' AS middle, 'brossard' AS last) AS name,
      'Software Engineer' AS occupation
    ) AS user
)

这个想法是使用嵌套的替换/结构构造语法将user结构替换为新的结构,其中name具有所需的结构类型。

答案 1 :(得分:0)

您必须重新构建这些结构。您可以执行以下操作:

select 
  struct(
    struct(
      user.name.first as firstName, 
      user.name.last as lastName
    ) as name,
    user.height as height
  ) as user,
  address,
  age
from mydataset.mytable

一旦您可以验证结果,就可以根据这些结果创建一个新表,或者覆盖现有表(这实际上是重命名列的一种解决方法,但要小心)。希望对您有所帮助。

相关问题