Kusto / Azure Data Explorer — Как я могу разделить внешнюю таблицу, используя поле timespan?

#azure #csv #datetime #timespan #azure-data-explorer

#azure #csv #дата и время #timespan #azure-data-explorer

Вопрос:

Надеюсь, кто-нибудь может помочь.. Я новичок в Kusto, и мне нужно заставить работать внешнюю таблицу, считывающую данные из учетной записи хранилища больших двоичных объектов Azure, но одна таблица, которая у меня есть, уникальна тем, что данные для столбца timestamp разделены на 2 отдельных столбца, т.Е. LogDate и LogTime (см. Сценарий ниже).).

Мои данные хранятся в следующей структуре в контейнере учетной записи хранилища Azure (например, контейнер называется «employeedata»): {employeename}/ {year}/ {month} / {day}/ {hour} / {minute}.csv в простом формате CSV.

Я знаю, что CSV хорош, потому что, если я импортирую его в обычную таблицу Kusto, он работает отлично.

Мой сценарий KQL для создания внешней таблицы выглядит следующим образом:

 .create-or-alter external table EmpLogs (Employee: string, LogDate: datetime, LogTime:timestamp) 
kind=blob 
partition by (EmployeeName:string = Employee, yyyy:datetime = startofday(LogDate), MM:datetime = startofday(LogDate), dd:datetime = startofday(LogDate), HH:datetime = todatetime(LogTime), mm:datetime = todatetime(LogTime))
pathformat = (EmployeeName "/" datetime_pattern("yyyy", yyyy) "/" datetime_pattern("MM", MM) "/" datetime_pattern("dd", dd) "/" substring(HH, 0, 2) "/" substring(mm, 3, 2) ".csv")
dataformat=csv 
( 
    h@'************************' 
) 
with (folder="EmployeeInfo", includeHeaders="All")
 

Я постоянно получаю сообщение об ошибке ниже, что не очень полезно (отредактировано из полной ошибки, в основном сводится к тому, что где-то есть синтаксическая ошибка):

Синтаксическая ошибка: не удалось проанализировать запрос: { «ошибка»: { «код»: «BadRequest_SyntaxError», «сообщение»: «Запрос недействителен и не может быть выполнен.», «@type»: «Kusto.Data.Exceptions.SyntaxException», «@message»: «Синтаксическая ошибка: запрос не может быть проанализирован : . Запрос: ‘.создать или изменить внешнюю таблицу……..

Я знаю todatetime() , что функция работает с timespan, я протестировал ее с другой таблицей, и она создала дату, похожую на следующую: 0001-01-01 20:18:00.0000000.

Я попытался использовать функцию bin () для столбцов timestamp / LogTime, но та же ошибка, что и выше, и даже попытался импортировать значение времени в виде строки и выполнить некоторые строковые манипуляции с ним, но безуспешно. Получение той же синтаксической ошибки.

Любая помощь / рекомендации будут с благодарностью.

Спасибо!!

Ответ №1:

В настоящее время нет способа определить раздел внешней таблицы на основе более чем одного столбца. Если временная метка вашего набора данных разделена между двумя столбцами: LogDate:datetime и LogTime:timestamp , тогда лучшее, что вы можете сделать, это использовать виртуальный столбец для разделения по времени:

 .create-or-alter external table EmpLogs(Employee: string, LogDate:datetime, LogTime:timespan) 
kind=blob 
partition by (EmployeeName:string = Employee, PartitionDate:datetime)
pathformat = (EmployeeName "/" datetime_pattern("yyyy/MM/dd/HH/mm", PartitionDate))
dataformat=csv 
( 
    //h@'************************'
) 
with (folder="EmployeeInfo", includeHeaders="All")
 

Теперь вы можете фильтровать по виртуальному столбцу и выполнять точную настройку с помощью LogTime :

 external_table("EmpLogs")
| where Employee in ("John Doe", ...)
| where PartitionDate between(datetime(2020-01-01 10:00:00) .. datetime(2020-01-01 11:00:00))
| where LogTime ...
 

Комментарии:

1. Спасибо, это был совет, в котором я нуждался. Похоже, для моего сценария все работает нормально!!