Kusto/Azure Data Explorer - 如何使用时间跨度字段对外部 table 进行分区?

Kusto/Azure Data Explorer - How can I partition an external table using a timespan field?

希望有人能帮忙.. 我是 Kusto 的新手,必须从 Azure Blob 存储帐户中获取外部 table 读取数据的工作,但我拥有的那个 table 是独一无二的,因为时间戳列的数据被分成 2单独的列,即 LogDate 和 LogTime(参见下面的脚本)。

我的数据存储在 Azure 存储帐户容器中的以下结构中(容器名为“employeedata”,例如): {employeename}/{year}/{month}/{day}/{hour}/{minute}.csv,采用简单的 CSV 格式。

我知道 CSV 很好,因为如果我将它导入普通的 Kusto table,它会完美运行。

我的外部 table 创建 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”, "message": "请求无效,无法执行。", "@type": "Kusto.Data.Exceptions.SyntaxException", "@message": "语法错误:无法解析查询:.查​​询:'.create-or-alter external table ......

我知道 todatetime() 函数适用于时间跨度,我用另一个 table 对其进行了测试,它创建了一个类似于以下内容的日期:0001-01-01 20:18:00.0000000 .

我曾尝试在 timestamp/LogTime 列上使用 bin() 函数,但出现与上述相同的错误,甚至尝试将时间值作为字符串导入并对其进行一些字符串操作,但没有成功.出现相同的语法错误。

任何 help/guidance 将不胜感激。

谢谢!!

目前,无法基于多列定义外部 table 分区。如果您的数据集时间戳分为两列:LogDate:datetimeLogTime: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 ...