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'

解决方案归功于 https://medium.com/@JustinCarmony/strategies-for-easier-google-analytics-bigquery-analysis-custom-dimensions-cad8afe7a153

由于问题被标记为 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