我正在寻找一种方法来重命名从我的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文件拉入并使用数据流进行转换。我希望有一个比这更优雅的解决方案。谢谢。
答案 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
一旦您可以验证结果,就可以根据这些结果创建一个新表,或者覆盖现有表(这实际上是重命名列的一种解决方法,但要小心)。希望对您有所帮助。