U-SQL: 如何根据内容跳过文件分析

U-SQL: How to skip files from analysis based on content

我有很多文件,每个文件都包含一组 json 个对象,如下所示:

{ "Id": "1", "Timestamp":"2017-07-20T10:43:21.8841599+02:00", "Session": { "Origin": "WebClient" }}
{ "Id": "2", "Timestamp":"2017-07-20T10:43:21.8841599+02:00", "Session": { "Origin": "WebClient" }}
{ "Id": "3", "Timestamp":"2017-07-20T10:43:21.8841599+02:00", "Session": { "Origin": "WebClient" }}

等等

每个文件都包含有关特定类型会话的信息。在这种情况下,它是来自 Web 应用程序的会话,但它也可以是桌面应用程序的会话。在这种情况下,Origin 的值是 "DesktopClient" 而不是 "WebClient"

出于分析目的,假设我只对 DesktopClient 会话感兴趣。

表示会话的所有文件都存储在 Azure Blob 存储中,如下所示:

container/2017/07/20/00399076-2b88-4dbc-ba56-c7afeeb9ef77.json
container/2017/07/20/00399076-2b88-4dbc-ba56-c7afeeb9ef78.json
container/2017/07/20/00399076-2b88-4dbc-ba56-c7afeeb9ef79.json

是否可以跳过第一行已经明确表示不是 DesktopClient 会话文件的文件,就像我的示例中那样?我认为如果可以跳过我所知道的不包含正确会话类型的文件,因为它们可以退出大文件,这将节省大量查询资源。

目前我的查询读取的数据是这样的:

@RawExtract  = EXTRACT [RawString] string
    FROM @"wasb://plancare-events-blobs@centrallogging/2017/07/20/{*}.json"
    USING Extractors.Text(delimiter:'\b', quoting : false);

@ParsedJSONLines = SELECT Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple([RawString]) AS JSONLine
        FROM @RawExtract;

...

或者我应该创建自己的 Extractors.Text 版本,如果是,我应该怎么做。

先回答问题评论中弹出的一些问题:

此时我们不提供对 Blob 存储元数据的访问。这意味着您需要将任何元数据表示为文件中数据的一部分或文件名(或路径)的一部分。

根据提取成本和文件大小,您可以提取所有行,然后过滤掉行开头不符合条件的行。这将提取所有文件和所有文件中的所有行,但不需要自定义提取器。

或者,编写一个自定义提取器,只检查合适的文件(如果第一个解决方案不能提供性能并且您可以有效地确定提取器内部的条件,这可能很有用)。在示例目录的 http://usql.io 中可以找到几个示例提取器(包括示例 JSON 提取器)。