【问题标题】:How do you define a date range and then query across a complex file set in USQL?您如何定义日期范围,然后在 USQL 中设置的复杂文件中进行查询?
【发布时间】:2017-12-02 01:19:32
【问题描述】:

跨单个文件的 USQL 有很多很好的例子。但是,您将如何复制一个非常常见的数据处理示例,其中您想要获取当前系统时间,从该时间中减去 X 天并根据该结果查询一组数据?以 SQL 为例:

SELECT * FROM MyTable
WHERE Date >= CAST(GETDATE() AS DATE) - 30
AND Date <= CAST(GETDATE() AS DATE) - 1

在上面的示例中,我的日期是我的文件位置,例如:

'yyyy' | 'MM' | 'DD' | Filename.csv

-- Example path
/MyDirectory/2017/12/01/SomeData.csv

因此,在 USQL 中是否有办法与 Azure Data Lake Analytics 进行类似操作,但使用文件位置而不是使用“{date:yyyy}/{date:MM}/{date:dd}/”查询所有内容表达式?

如果这不可能,那么至少指定一个范围怎么样:

"/MyDirectory/2017/{10-12}/{1-30}/{filename:*}.csv"

我可以将所有文件合并到一个目录中,并使用数据中的自然日期字段在提取器之后使用 SELECT 语句进行过滤,但目录结构的重点是减少不需要的读取(事务)并且仅定位根据所述文件本身的日期进行查询所需的特定目录。

【问题讨论】:

  • 您是否尝试过使用 {date:MM}{date:dd}{date:yyyy},然后在下一个 SELECT 语句中使用“日期”虚拟列进行过滤?您的工作实际上应该识别过滤器并仅读取所需的文件夹...
  • 我刚刚遇到了一个使用虚拟列的示例。我只是不确定这是否只会基于“WHERE date >= DateTime.Parse("2017-11-01")”来读取目录/文件。如果它只读取需要的内容,而不是所有 YYYY 数据,那将是很好的,也是我问题的答案!如果 USQL 中不存在系统时间函数,我显然可以使用脚本生成日期。
  • 它应该根据虚拟列上的过滤器对输入集进行分区消除,并且只读取需要的内容...

标签: azure azure-data-lake u-sql


【解决方案1】:

玛雅是正确的。 U-SQL 语言参考中有示例,更具体地说,EXTRACT Expression (U-SQL)。请参阅“具有多个文件的多个目录”下的示例。以下是对该示例的一些修改,似乎可以满足您的要求。

1) 示例缺失DECLARE @dir string = "/Samples/Data/AmbulanceData/";
2) 修改DECLARE @file_set_path2DECLARE @file_set_path2 string = @dir + "{date:yyyy}/{date:MM}/{date:dd}/vehicle{vid}_{*}.csv";
3. 对于您的过滤器,您可以使用WHERE date &gt;= DateTime.Now.AddDays(-30) AND date &lt;= DateTime.Now.AddDays(-1)

【讨论】:

  • 太棒了,不知道 AddDays() 方法。我会试一试,然后检查一下。谢谢!
  • 请注意,由于 U-SQL 使用 C# 作为其表达式语言,因此您可以使用大多数方法。虽然并非所有这些都是可恒定折叠的(这是消除分区所必需的),但像 AddDays 这样的操作是可恒定折叠的。
  • 注明。将解决方案标记为有效。它的效果很好,并且在与 AddDays() 方法匹配的所有目录中完全符合我的要求。
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2021-08-19
  • 2023-04-05
相关资源
最近更新 更多