在BigQuery的标准SQL中使用句点“。”

问题描述 投票:4回答:2

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

google-bigquery
2个回答
3
投票

这取决于你想要完成什么。一种解释是你想要返回一个名为STRUCTtime,里面有一个名为ts的字段。如果是这种情况,您可以使用STRUCT运算符来构建结果:

SELECT
  id,
  STRUCT(time_ts AS ts) AS time
FROM `bigquery-public-data.hacker_news.comments` 
LIMIT 10;

在BigQuery UI中,它将显示结果为idtime.ts,后者表示ts位于名为STRUCTtime中。

BigQuery不允许结果中包含句点的列,因此如果运行以下查询,则会出现错误:

SELECT
  id,
  time_ts AS `time.ts`
FROM `bigquery-public-data.hacker_news.comments` 
LIMIT 10;

字段名称“time.ts”无效。字段必须仅包含字母,数字和下划线,以字母或下划线开头,最多128个字符。


3
投票

Elliot的答案非常好,并解决了你问题的第一部分,所以让我解决它的第二部分(因为它完全不同)

首先,我想提一下像Bigzi 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
© www.soinside.com 2019 - 2024. All rights reserved.