【发布时间】:2017-06-23 04:19:06
【问题描述】:
我有一个很大的 Blob 存储,里面装满了日志文件,这些日志文件根据它们的标识符在多个级别进行组织:存储库、分支、内部版本号、构建步骤号。
这些是包含对象数组的 JSON 文件,每个对象都有一个 timestamp 和一个 entry 值。我已经实现了一个自定义提取器(扩展 IExtractor),它接受一个输入流并生成许多纯文本行。
初始加载
现在我正在尝试将所有这些数据加载到 ADL 存储。我创建了一个类似于此的查询:
@entries =
EXTRACT
repo string,
branch string,
build int,
step int,
Line int,
Entry string
FROM @"wasb://my.blob.core.windows.net/{repo}/{branch}/{build}/{step}.json"
USING new MyJSONExtractor();
当我运行这个提取查询时,我得到一个编译器错误 - 它超过了 25 分钟编译时间的限制。我的猜测是:文件太多。所以我在INSERT INTO 查询中添加了WHERE 子句:
INSERT INTO Entries
(Repo, Branch, Build, Step, Line, Entry)
SELECT * FROM @entries
WHERE (repo == "myRepo") AND (branch == "master");
仍然没有运气 - 编译器超时。
(但是,当我处理单个构建时,它确实有效,将 {step} 作为唯一的通配符,并对其余名称进行硬编码。)
问题:有没有办法在许多作业中执行类似的加载 - 但不需要显式(手动)“分区”输入文件列表?
增量加载
让我们暂时假设我成功加载了这些文件。但是,几天后我需要执行更新 - 我应该如何指定文件列表?我有一个保存所有元数据的 SQL Server 数据库,我可以提取准确的日志文件路径 - 但 U-SQL 的 EXTRACT 查询强制我提供一个指定输入数据的静态字符串。
一个简单的方案是为每个日期定义一个顶级目录并每天处理它们。但是系统的设计方式使这非常困难,如果不是不可能的话。
问题:有没有办法根据文件的创建时间来识别文件?或者也许有一种方法可以将 SQL Server 数据库的查询与提取查询结合起来?
【问题讨论】:
标签: azure azure-data-lake u-sql