我是谷歌的BigQuery新手
我想根据日期和月份来解析时间戳(yyyy/mm/dd:hh:mm:ss
)。
我没有找到任何可以做到这一点的BigQuery函数。
因此,我想知道是否有一种方法可以编写UDF
然后在BigQuery查询中访问它
答案 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
);