Google bigquery 有没有办法修改和重命名BigQuery中记录中的列,然后使该列保持与以前相同的名称和位置?
我在BigQuery中有一个Google bigquery 有没有办法修改和重命名BigQuery中记录中的列,然后使该列保持与以前相同的名称和位置?,google-bigquery,Google Bigquery,我在BigQuery中有一个记录,结构如下: Parent |___Child_1 |___Child_2 |___Child_3 |___... Child_1的类型为TIMESTAMP,因此我想将其从TIMESTAMP字符串转换为INT64,表示自Unix纪元以来的毫秒数。这是通过函数完成的 我在为嵌套字段执行此操作时遇到问题。以下是我的尝试: select *, unix_millis(parent.child_1) as parent.child_1 from `dataset.tab
记录
,结构如下:
Parent
|___Child_1
|___Child_2
|___Child_3
|___...
Child_1
的类型为TIMESTAMP
,因此我想将其从TIMESTAMP
字符串转换为INT64
,表示自Unix纪元以来的毫秒数。这是通过函数完成的
我在为嵌套字段执行此操作时遇到问题。以下是我的尝试:
select *, unix_millis(parent.child_1) as parent.child_1 from `dataset.table`
当我尝试上述操作时,BigQuery中的查询编辑器在“as parent.child_1”中的“child_1”下加了下划线,并给出了错误语法错误:输入预期结束,但得到“
我之所以希望这样做是因为,对于非嵌套字段,可以使用unix\u millis
,然后使用AS
操作符重命名列
那么,我如何执行
unix\u millis
函数,然后确保生成的列在记录中的名称和位置与以前相同呢?下面是针对BigQuery标准SQL的
#standardSQL
SELECT *
REPLACE((
SELECT AS STRUCT * REPLACE(UNIX_MILLIS(child1) AS child1)
FROM UNNEST([parent])
) AS parent)
FROM `project.dataset.table`
您可以使用一些简化的虚拟数据来测试、播放上述内容,如下例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, STRUCT<child1 TIMESTAMP, child2 STRING, child3 INT64>(CURRENT_TIMESTAMP(), 'test1', 123) parent UNION ALL
SELECT 2, STRUCT<child1 TIMESTAMP, child2 STRING, child3 INT64>(CURRENT_TIMESTAMP(), 'test2', 456)
)
SELECT *
REPLACE((
SELECT AS STRUCT * REPLACE(UNIX_MILLIS(child1) AS child1)
FROM UNNEST([parent])
) AS parent)
FROM `project.dataset.table`
而原始数据
Row id parent.child1 parent.child2 parent.child3
1 1 2020-09-03 17:29:09.512794 UTC test1 123
2 2 2020-09-03 17:29:09.512794 UTC test2 456
谢谢你的帮助@Mikhail!只是一个后续问题,我需要如何更改语法才能更改记录中的双嵌套或n嵌套字段?即,如果child_1
有一个child_1_1…
,很高兴它对您有用。至于后续问题,如果没有适当的细节,在评论中很难回答。请发布新问题,提供详细信息、数据示例和预期结果,以便我(或其他人)能够提供帮助:o)当然,这是有意义的。再次感谢!很抱歉,发布这个问题花了一些时间,我想试着自己解决它。。。我没有成功,但希望你能教我如何完成!问题是肯定的。但是我认为你应该用一些更具体的例子来编辑这个新问题,比如说2到3级嵌套。正如现在的情况——有N个级别——获得好答案的机会较少——但这取决于你:o)
Row id parent.child1 parent.child2 parent.child3
1 1 2020-09-03 17:29:09.512794 UTC test1 123
2 2 2020-09-03 17:29:09.512794 UTC test2 456