BigQuery标准SQL似乎不允许使用句号“。”在select语句中。即使是简单的查询(见下文)似乎也失败了。对于字段名称包含“。”的数据集,这是一个大问题。有没有一种简单的方法来避免这个问题?
select id, time_ts as time.ts
from `bigquery-public-data.hacker_news.comments`
LIMIT 10
返回错误...
Error: Syntax error: Unexpected "." at [1:27]
这也失败了......
select * except(detected_circle.center_x )
from [bigquery-public-data:eclipse_megamovie.photos_v_0_2]
LIMIT 10
答案 0 :(得分:3)
这取决于你想要完成的任务。一种解释是,您希望返回名为STRUCT
的{{1}},其中包含一个名为time
的字段。如果是这种情况,您可以使用ts
运算符来构建结果:
STRUCT
在BigQuery用户界面中,它会将结果显示为SELECT
id,
STRUCT(time_ts AS ts) AS time
FROM `bigquery-public-data.hacker_news.comments`
LIMIT 10;
和id
,后者表示time.ts
位于名为ts
的{{1}}内
BigQuery不允许结果中包含句点的列,因此如果运行以下查询,您将收到错误:
STRUCT
无效的字段名称" time.ts"。字段必须仅包含字母,数字和下划线,以字母或下划线开头,最多128个字符。
答案 1 :(得分:3)
Elliot的回答非常好,并解决了你问题的第一部分,所以让我解决它的第二部分(因为它完全不同)
首先,我想提一下,BigQuery Standard SQL支持像SELECT * EXCEPT
这样的选择修饰符,而不是
SELECT * EXCEPT(detected_circle.center_x )
FROM [bigquery-public-data:eclipse_megamovie.photos_v_0_2]
LIMIT 10
你应该尝试
#standardSQL
SELECT * EXCEPT(detected_circle.center_x )
FROM `bigquery-public-data.eclipse_megamovie.photos_v_0_2`
LIMIT 10
当然现在我们又回到了`标准sql中使用句号
的问题因此,上述代码只能在您尝试从center_x
STRUCT(可空记录)中删除detected_circle
字段时进行解释。从技术上讲,这是有道理的,可以使用下面的代码
SELECT *
REPLACE(STRUCT(detected_circle.radius, detected_circle.center_y ) AS detected_circle)
FROM `bigquery-public-data.eclipse_megamovie.photos_v_0_2`
LIMIT 10
...仍然不清楚如何使用您的建议删除整个detected_circle。*
SELECT * EXCEPT(detected_circle)
FROM `bigquery-public-data.eclipse_megamovie.photos_v_0_2`
LIMIT 10