【发布时间】:2012-07-26 07:30:03
【问题描述】:
我对 Google 的 BigQuery 非常陌生
我想根据日期和月份解析时间戳 (yyyy/mm/dd:hh:mm:ss),希望将天分成几周。
我没有找到任何这样做的 BigQuery 函数。
因此,我想知道是否有一种方法可以编写 UDF,然后在 BigQuery 查询中访问它
【问题讨论】:
标签: google-bigquery
我对 Google 的 BigQuery 非常陌生
我想根据日期和月份解析时间戳 (yyyy/mm/dd:hh:mm:ss),希望将天分成几周。
我没有找到任何这样做的 BigQuery 函数。
因此,我想知道是否有一种方法可以编写 UDF,然后在 BigQuery 查询中访问它
【问题讨论】:
标签: google-bigquery
这里有两个问题,所以两个答案:
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 是使用一周中的哪一天作为“开始”的参数;我使用了星期日,但对于“商务”-y 使用 1(即星期一)可能更有意义。
以防万一,文档中的section on timestamp functions 很有帮助。
【讨论】:
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);
代码:
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
);
【讨论】: