Как заставить Google BigQuery понимать формат даты, например 04.01.2019 07: 06: 48.607? - PullRequest
0 голосов
/ 10 июля 2019

Я использую Google BigQuery для анализа CSV-файла в моем облачном хранилище объемом 130 МБ и 21 млн. поиск строк, введенных в интернет-магазине. При попытке оценить эти данные с помощью Google Data Studio я не получаю данных при добавлении «измерения времени» в формате 04.01.2019 07: 06: 48.607.

Файл слишком большой, чтобы изменить каждое поле вручную.

В настоящее время я использую как тип STRING и как режим NULLABLE, так как в противном случае поле "timestamp" приведет к ошибке.

В конечном итоге я хотел бы, чтобы все данные в этой таблице были фильтруемыми по периодам, чтобы я мог видеть тенденции введенных поисковых запросов.

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Вы можете сделать это на уровне запроса, используя PARSE_TIMESTAMP:

WITH
  data AS (SELECT 1 AS col_1,"04.01.2019 07:06:48.607" AS ts,"foo" AS col_3)

SELECT
  * REPLACE(PARSE_TIMESTAMP("%m.%d.%Y %H:%M:%E*S",ts) AS ts)
FROM
  data

Я делаю предположение, что значениями выше являются месяц , затем день - если нет, вам нужно будет поменять первую часть шаблона на %d.%m. Кроме того, я использую синтаксис BigQuery SELECT * REPLACE(), чтобы перезаписать исходное значение вашего столбца форматированной версией в результатах (что также имеет преимущество при сохранении исходного порядка полей). Это отличная функция, но она может также легко включить тот же самый вызов функции в существующий запрос.

Где вы это сделаете, так как ваш отчет зависит от вас; Вы можете использовать источник данных Custom Query в Data Studio для изменения с помощью запроса, как описано выше, добавить представление в BigQuery с этой логикой и использовать его в качестве источника (но обратите внимание, что представления негативно влияют на кэширование для Data Studio) или материализовать таблицу вручную или с помощью запланированного запроса.

Когда вы запустите это для таблицы, вы получите ошибку, если какое-либо из значений не соответствует этому шаблону. Если вам необходимо внести изменения, обратитесь к полному списку поддерживаемых элементов формата для отметок времени . Вы также можете вызывать функцию с префиксом SAFE. (т. Е. SAFE.PARSE_TIMESTAMP(), если вы предпочитаете получить значение NULL, когда метка времени не может быть проанализирована.

(Обратите внимание, что вы также можете использовать PARSE_DATETIME с той же строкой формата, если этот тип данных больше подходит для вашего варианта использования.)

0 голосов
/ 10 июля 2019

Следующее перестраивает строку в правильный формат для преобразования в метку времени.

with example as (
  select '04.01.2019 07:06:48.607' as my_datestring
),
components as (
  select 
    my_datestring,
    substr(my_datestring,1,2) as m,
    substr(my_datestring,4,2) as d,
    substr(my_datestring,7,4) as yyyy,
    substr(my_datestring,12,2) as hr,
    substr(my_datestring,15,2) as min,
    substr(my_datestring,18,2) as sec,
    substr(my_datestring,21,3) as milli
  from example
),
prep as (
  select 
    my_datestring, 
    concat(yyyy,'-',m,'-',d,' ',hr,':',min,':',sec,'.',milli,'000 UTC') as fixed_datestring
  from components
)
select my_datestring, fixed_datestring, cast(fixed_datestring as timestamp) as my_timestamp
from prep

* Предполагается, что датой является 1 апреля (если 4 января, вам потребуется переключить m и d в components CTE.
** Также предполагается, чтовременная метка UTC, вам может потребоваться дополнительная настройка в зависимости от того, связаны ли ваши исходные данные с конкретным часовым поясом или если ваш окончательный вывод требует определенного часового пояса.
*** Вероятно, существует более умный способ разделения / переформатирования строки

...