BigQuery 无法保存使用函数的视图
BigQuery fails to save view that uses functions
我们将 BigQuery 与他们的新方言“standard”SQL 结合使用。
新的 SQL 支持用 SQL 而不是 JS 编写的内联函数,因此我们创建了一个函数来处理日期转换。
CREATE TEMPORARY FUNCTION
STR_TO_TIMESTAMP(str STRING)
RETURNS TIMESTAMP AS (PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*SZ', str));
它必须是一个临时函数,因为 Google returns Error: Only temporary functions are currently supported; use CREATE TEMPORARY FUNCTION
如果你尝试一个永久函数。
如果您尝试通过使用内联函数的查询来保存视图 - 您会收到以下错误:Failed to save view. No support for CREATE TEMPORARY FUNCTION statements inside views
。
如果您试图超越它并删除该函数(希望在查询期间添加它),您将收到此错误 Failed to save view. Function not found: STR_TO_TIMESTAMP at [4:7]
.
关于如何解决这个问题有什么建议吗?我们有比所示示例更复杂的功能。
根据文档 https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement,该功能仍处于 Beta 阶段,但可以使用。可以在创建它的同一数据集中查看这些函数,并且可以创建视图。
如果这对您有用,或者您有任何对其他人有帮助的发现,请分享。
仍然不支持保存使用临时函数创建的视图,但您可以做的是计划 SQL-查询(已推出最新的 UI),然后保存它作为 table。这对我有用,但我想这取决于您想要的查询参数。
##standardSQL
## JS in SQL to extract multiple h.CDs at the same time.
CREATE TEMPORARY FUNCTION getCustomDimension(cd ARRAY<STRUCT< index INT64,
value STRING>>, index INT64)
RETURNS STRING
LANGUAGE js AS """
for(var i = 0; i < cd.length; i++) {
var item = cd[i];
if(item.index == index) {
return item.value
}
}
return '';
""";
SELECT DISTINCT h.page.pagePath, getcustomDimension(h.customDimensions,20), fullVisitorId,h.page.pagePathLevel1, h.page.pagePathLevel2, h.page.pagePathLevel3, getcustomDimension(h.customDimensions,3)
FROM
`XXX.ga_sessions_*`,
UNNEST(hits) AS h
WHERE
### rolling timeframe
_TABLE_SUFFIX = FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(),INTERVAL YY DAY))
AND h.type='PAGE'
由于问题被标记为 resolved, BigQuery now supports permanents registration of UDFs。
为了在视图中使用您的 UDF,您需要先创建它。
CREATE OR REPLACE FUNCTION `ACCOUNT-NAME11111.test.STR_TO_TIMESTAMP`
(str STRING)
RETURNS TIMESTAMP AS (PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*SZ', str));
- 请注意,函数名称必须使用反引号。
- 声明中没有
TEMPORARY
,因为该函数将被全局注册并持久化。
- 由于 BigQuery 处理命名空间的方式,您必须在函数名称中同时包含项目名称和数据集名称 (
test
)。
创建并成功运行后,您可以将其用作视图。
create view test.test_view as
select `ACCOUNT-NAME11111.test.STR_TO_TIMESTAMP`('2015-02-10T13:00:00Z') as ts
然后您可以直接查询您的视图,而无需在任何地方显式指定 UDF。
select * from test.test_view
我们将 BigQuery 与他们的新方言“standard”SQL 结合使用。 新的 SQL 支持用 SQL 而不是 JS 编写的内联函数,因此我们创建了一个函数来处理日期转换。
CREATE TEMPORARY FUNCTION
STR_TO_TIMESTAMP(str STRING)
RETURNS TIMESTAMP AS (PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*SZ', str));
它必须是一个临时函数,因为 Google returns Error: Only temporary functions are currently supported; use CREATE TEMPORARY FUNCTION
如果你尝试一个永久函数。
如果您尝试通过使用内联函数的查询来保存视图 - 您会收到以下错误:Failed to save view. No support for CREATE TEMPORARY FUNCTION statements inside views
。
如果您试图超越它并删除该函数(希望在查询期间添加它),您将收到此错误 Failed to save view. Function not found: STR_TO_TIMESTAMP at [4:7]
.
关于如何解决这个问题有什么建议吗?我们有比所示示例更复杂的功能。
根据文档 https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement,该功能仍处于 Beta 阶段,但可以使用。可以在创建它的同一数据集中查看这些函数,并且可以创建视图。 如果这对您有用,或者您有任何对其他人有帮助的发现,请分享。
仍然不支持保存使用临时函数创建的视图,但您可以做的是计划 SQL-查询(已推出最新的 UI),然后保存它作为 table。这对我有用,但我想这取决于您想要的查询参数。
##standardSQL
## JS in SQL to extract multiple h.CDs at the same time.
CREATE TEMPORARY FUNCTION getCustomDimension(cd ARRAY<STRUCT< index INT64,
value STRING>>, index INT64)
RETURNS STRING
LANGUAGE js AS """
for(var i = 0; i < cd.length; i++) {
var item = cd[i];
if(item.index == index) {
return item.value
}
}
return '';
""";
SELECT DISTINCT h.page.pagePath, getcustomDimension(h.customDimensions,20), fullVisitorId,h.page.pagePathLevel1, h.page.pagePathLevel2, h.page.pagePathLevel3, getcustomDimension(h.customDimensions,3)
FROM
`XXX.ga_sessions_*`,
UNNEST(hits) AS h
WHERE
### rolling timeframe
_TABLE_SUFFIX = FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(),INTERVAL YY DAY))
AND h.type='PAGE'
由于问题被标记为 resolved, BigQuery now supports permanents registration of UDFs。 为了在视图中使用您的 UDF,您需要先创建它。
CREATE OR REPLACE FUNCTION `ACCOUNT-NAME11111.test.STR_TO_TIMESTAMP`
(str STRING)
RETURNS TIMESTAMP AS (PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*SZ', str));
- 请注意,函数名称必须使用反引号。
- 声明中没有
TEMPORARY
,因为该函数将被全局注册并持久化。 - 由于 BigQuery 处理命名空间的方式,您必须在函数名称中同时包含项目名称和数据集名称 (
test
)。
创建并成功运行后,您可以将其用作视图。
create view test.test_view as
select `ACCOUNT-NAME11111.test.STR_TO_TIMESTAMP`('2015-02-10T13:00:00Z') as ts
然后您可以直接查询您的视图,而无需在任何地方显式指定 UDF。
select * from test.test_view