U-SQL 根据序号位置提取列

U-SQL extract a column based on its ordinal position

我正在试验 Azure Data Lake,并尝试使用大量数据文件。

这些文件是 CSV 文件。文件夹结构如下:

/jobhistory/(AccountId)/(JobId)/*.csv

在 CSV 文件中,第 6 列是 username

我想做的是提取帐户 ID、工作 ID 和用户名(然后,为了进行实验,对这些数据进行一些汇总)。

按照在线教程,我写了这样的东西:

DECLARE @file_set_path = "/jobhistory/{AccountId}/{JobId}/{FileName}.csv";

@metadata =
    EXTRACT AccountId int,
            JobId string,
            FileName string,
            UserName string
    FROM @file_set_path
    USING Extractors.Csv();

现在,我遇到的问题(我认为)是 UserName 字段是 csv 文件中的第 6 列,但文件中没有 header 行。

如何将 UserName 分配给文件中的第 6 列?

此外,如果我完全走错了路,请告诉我;这和我习惯的很不一样。

内置的CSV提取器是一个位置提取器。这意味着您必须在提取模式中指定所有列(即使是您不感兴趣的列)。

所以你会这样写(假设用户名是第 6 列,而你有 10 列):

DECLARE @file_set_path = "/jobhistory/{AccountId}/{JobId}/{FileName}.csv";

@metadata =
  EXTRACT AccountId int,
          JobId string,
          FileName string,
          c1 string, c2 string, c3 string, c4 string, c5 string,
          UserName string,
          c7 string, c8 string, c9 string
  FROM @file_set_path
  USING Extractors.Csv();

@metadata = 
  SELECT AccountId,
          JobId,
          FileName,
          UserName
  FROM @metadata;

请注意,SELECT 投影将被推入 EXTRACT,因此它不会对您不 select 的列进行完整的列处理。

如果您知道第 6 列是您感兴趣的列,您还可以编写一个自定义提取器来跳过其他列。然而,与内置提取器相比,运行 自定义提取器的权衡可能不值得。

(另请注意,您可以使用 ADL 工具创建 EXTRACT 表达式(没有虚拟列),因此您无需手动执行:

https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md#adl-tools-for-visualstudio-now-helps-you-generate-the-u-sql-extract-statement