Вопрос
Я очень новичок в BigQuery от Google
Я хочу проанализировать отметку времени (yyyy/mm/dd:hh:mm:ss
) в зависимости от дня и месяца хотите разделить дни на недели.Я не нашел ни одной функции BigQuery, которая делала бы это.
Следовательно, мне было интересно, есть ли способ, которым я могу написать UDF
а затем получить к нему доступ с помощью запроса BigQuery
Решение
Здесь есть два вопроса, а значит, и два ответа:
Большой запрос делает поддержка UDFS: доктора.(Этого не произошло, когда я впервые ответил на этот вопрос.)
Даже без UDFS группировка дат по-прежнему выполнима.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
(т.е.Понедельник), вероятно, имело бы больше смысла.
На всякий случай, если вам это понадобится, раздел, посвященный функциям временных меток в документации это полезно.
Другие советы
Поддержка UDF в BigQuery теперь здесь! https://cloud.google.com/bigquery/user-defined-functions
Вот некоторый код, который преобразует строковый спецификатор времени в объект даты JavaScript и извлекает из него некоторые свойства;видеть https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date для получения информации о недвижимости, доступной на ближайшие даты.
ЗАПРОС (замените вложенный select вашей таблицей):
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
);