bigquery UDF支持

时间:2012-07-26 07:30:03

标签: google-bigquery

我是谷歌的BigQuery新手

我想根据日期和月份来解析时间戳(yyyy/mm/dd:hh:mm:ss)。 我没有找到任何可以做到这一点的BigQuery函数。

因此,我想知道是否有一种方法可以编写UDF然后在BigQuery查询中访问它

2 个答案:

答案 0 :(得分:2)

这里有两个问题,所以有两个答案:

  • BigQuery 支持支持UDF:docs。 (当我第一次回答这个时,它没有。)

  • 即使没有UDF,日期分组仍然可行。 BigQuery有一次解析函数PARSE_UTC_USEC,它期望以YYYY-MM-DD hh:mm:ss形式输入。您需要使用REGEXP_REPLACE将日期设置为正确的格式。完成后,UTC_USEC_TO_WEEK会阻止事情进入数周,您可以将其分组。所以将所有这些结合在一起,如果你的表有一个名为timestamp的列,你可以通过像

    这样的一周获得计数
    SELECT week, COUNT(week)
    FROM (SELECT UTC_USEC_TO_WEEK(
                   PARSE_UTC_USEC(
                     REGEXP_REPLACE(
                       timestamp, 
                       r"(\d{4})/(\d{2})/(\d{2}):(\d{2}):(\d{2}):(\d{2})", 
                       r"\1-\2-\3 \4:\5:\6")), 0) AS week
          FROM mytable) 
    GROUP BY week;
    

    请注意,0这里是用作“开始”的星期几的参数;我用过星期天,但对于“商业” - 使用1(即星期一)的事情可能会更有意义。

万一您需要它,文档中的section on timestamp functions会有所帮助。

答案 1 :(得分:1)

BigQuery中的UDF支持现在就在这里! https://cloud.google.com/bigquery/user-defined-functions

以下是一些代码,它们将字符串时间说明符转换为JavaScript Date对象,并从中提取一些属性;有关JS日期可用属性的信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

QUERY(用表替换嵌套的选择):

SELECT day_of_week, month_date
FROM parseDate(select '2015/08/01 12:00:00' as date_string);

CODE:

function parsedate(row, emit) {
  var d = new Date(row.date_string);
  emit({day_of_week: d.getDay(),
        month_date: d.getDate()});
}

bigquery.defineFunction(
  'parseDate',                           // Name of the function exported to SQL
  ['date_string'],                    // Names of input columns
  [{'name': 'day_of_week', 'type': 'integer'},
   {'name': 'month_date', 'type': 'integer'}],
  parsedate
);