U-SQL:如何根据内容

时间:2017-07-24 12:33:03

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

我有很多文件,每个文件包含一组像这样的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版本,如果是这样,我应该怎么做。

1 个答案:

答案 0 :(得分:2)

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

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

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

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