Suporte a UDF do BigQuery
-
11-12-2019 - |
Pergunta
Sou muito novo no BigQuery do Google
Quero analisar o carimbo de data/hora (yyyy/mm/dd:hh:mm:ss
) com base no dia e no mês deseja dividir os dias em semanas.Não encontrei nenhuma função do BigQuery que faça isso.
Portanto, eu queria saber se havia uma maneira pela qual eu pudesse escrever um UDF
e acesse-o em uma consulta do BigQuery
Solução
Há duas perguntas aqui, então duas respostas:
BigQuery faz suporta UDFs: documentos.(Não aconteceu quando respondi pela primeira vez.)
Mesmo sem UDFs, o intervalo de datas ainda é viável.O BigQuery tem uma função de análise única,
PARSE_UTC_USEC
, que espera entrada no formatoYYYY-MM-DD hh:mm:ss
.Você precisará usarREGEXP_REPLACE
para colocar sua data no formato correto.Depois de fazer isso,UTC_USEC_TO_WEEK
irá bloquear as coisas em semanas, e você pode agrupar por isso.Então, juntando tudo isso, se sua tabela tiver uma coluna chamadatimestamp
, você poderia obter contagens por semana através de algo comoSELECT 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;
Observe que o
0
aqui está o argumento para qual dia da semana usar como “início”;Eu usei o domingo, mas para coisas de "negócios" usando1
(ou seja,segunda-feira) provavelmente faria mais sentido.
Caso você precise, o seção sobre funções de carimbo de data/hora nos documentos é útil.
Outras dicas
O suporte UDF no BigQuery já está aqui! https://cloud.google.com/bigquery/user-defined-functions
Aqui está um código que irá converter um especificador de tempo de string em um objeto JavaScript Date e extrair algumas propriedades dele;ver https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date para obter informações sobre propriedades disponíveis para datas JS.
QUERY (substitua o select aninhado pela sua tabela):
SELECT day_of_week, month_date
FROM parseDate(select '2015/08/01 12:00:00' as date_string);
CÓDIGO:
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
);