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

Foi útil?

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 formato YYYY-MM-DD hh:mm:ss.Você precisará usar REGEXP_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 chamada timestamp, você poderia obter contagens por semana através de algo como

    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;
    

    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" usando 1 (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
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top