【问题标题】:Kusto/Azure Data Explorer - How can I partition an external table using a timespan field?Kusto/Azure 数据资源管理器 - 如何使用时间跨度字段对外部表进行分区?
【发布时间】:2020-12-03 16:49:56
【问题描述】:

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

我的数据存储在 Azure Storage 帐户容器中的以下结构中(例如,容器名为“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")

我不断收到以下错误,这不是很有帮助(从完全错误中编辑,基本上归结为某处存在语法错误):

语法错误:无法解析查询:{ “错误”: { "code": "BadRequest_SyntaxError", "message": "请求无效,无法执行。", "@type": "Kusto.Data.Exceptions.SyntaxException", "@message": "语法错误:无法解析查询:. 查询:'.create-or-alter external table ........

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

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

任何帮助/指导将不胜感激。

谢谢!!

【问题讨论】:

    标签: azure csv datetime timespan azure-data-explorer


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这是我需要的建议。似乎适用于我的场景!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多