我有一个很大的blob存储空间,其中包含许多日志文件,这些日志文件按照其级别进行组织:存储库,分支,内部版本号,构建步骤号。Azure数据湖中的增量负载
这些是包含对象数组的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");
仍然没有运气 - 编译器超时。
(它的工作,然而,当我处理一个单一的构建,使{步}作为唯一的通配符,进行硬编码名称的其余部分。)
问:是否有办法在许多作业中执行这样的负载 - 但不需要显式(手动)“分区”输入文件列表?
增量负载
假设为我成功地加载这些文件片刻。但是,从现在起几天我需要执行更新 - 我该如何指定文件列表?我有一个保留所有元数据的SQL Server数据库,并且我可以提取确切的日志文件路径 - 但U-SQL的EXTRACT
查询强制我提供一个指定输入数据的静态字符串。
一个简单的方案是为每个日期定义一个顶级目录并逐日处理它们。但系统设计的方式使得这非常困难,如果不是不可能的话。
问题:有没有一种方法来识别文件的创建时间?或者,也许有一种方法可以将查询与提取查询结合到SQL Server数据库中?
这正是我们现在计划要做的事情:拥有一个C#服务,用于查询我们的SQL Server并生成包含硬编码文件路径的U-SQL脚本。它没有一个脚本来完成这项工作的优雅,但肯定是可行的。 – lbartnik