BigQuery无法保存使用函数的视图

时间:2017-02-14 16:35:45

标签: google-bigquery

我们正在使用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必须是临时功能,因为Google会返回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]

有关如何解决此问题的任何建议?我们有比所示示例更复杂的功能。

3 个答案:

答案 0 :(得分:1)

根据文档https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement,该功能仍处于Beta阶段,但可行。可以在与创建函数相同的数据集中查看函数,也可以创建视图。 请分享一下,如果这对您而言效果很好,或者您有任何对他人有用的发现。

答案 1 :(得分:1)

仍然不支持保存使用temp函数创建的视图,但是您可以做的是计划SQL查询(已针对最新的UI推出),然后将其保存为表。这对我有用,但是我想这取决于您想要的查询参数。

##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

答案 2 :(得分:1)

由于该问题被标记为resolved,因此BigQuery现在支持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

querying a BigQuery view that uses a permanently registered UDF