Google bigquery BigQueryUDF支持

Google bigquery BigQueryUDF支持,google-bigquery,Google Bigquery,我对谷歌的BigQuery非常陌生 我想根据希望将天转换为周的日期和月份来解析时间戳(yyyy/mm/dd:hh:mm:ss)。 我没有找到任何BigQuery函数可以这样做 因此,我想知道是否有一种方法可以让我编写一个UDF,然后在BigQuery查询中访问它这里有两个问题,所以有两个答案: BigQuery是否支持自定义项:。(当我第一次回答这个问题时,它没有。) 即使没有UDF,日期匹配仍然是可行的。BigQuery有一个时间解析函数,PARSE\u UTC\u USEC,它需要以YYY

我对谷歌的BigQuery非常陌生

我想根据希望将天转换为周的日期和月份来解析时间戳(
yyyy/mm/dd:hh:mm:ss
)。 我没有找到任何BigQuery函数可以这样做


因此,我想知道是否有一种方法可以让我编写一个
UDF
,然后在BigQuery查询中访问它这里有两个问题,所以有两个答案:

  • BigQuery是否支持自定义项:。(当我第一次回答这个问题时,它没有。)

  • 即使没有UDF,日期匹配仍然是可行的。BigQuery有一个时间解析函数,
    PARSE\u UTC\u USEC
    ,它需要以
    YYYY-MM-DD hh:MM:ss
    的形式输入。您需要使用
    REGEXP\u REPLACE
    将日期转换为正确的格式。完成后,
    UTC\u USEC\u TO\u 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
    (即星期一)可能更有意义


为了以防万一,文档中的选项非常有用。

BigQuery中的自定义项支持现在就在这里

下面是一些将字符串时间说明符转换为JavaScript日期对象的代码,并从中提取一些属性;有关JS日期可用属性的信息,请参阅

查询(用表替换嵌套的select):

代码:


谢谢@Craig,我刚刚完成了我对Bigquery的第一次分析,man Query非常快。关于a)缺少UDF支持b)对联接的限制c)加载时间问题BigQuery现在有UDF支持:虽然此链接可能会有所帮助,但您能否在问题中添加一些相关信息,以便在链接消失时信息仍然保留?谢谢,更新了带有查询和代码示例的注释。UDF现在可用:
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
);