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

时间:2018-04-16 12:57:44

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

我正在尝试使用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列,但文件中没有标题行。

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

另外,如果我在这里走错路,请告诉我。这与我以前的情况大不相同。

1 个答案:

答案 0 :(得分:2)

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

所以你会写一些类似的东西(假设用户名是第6个col,你有10个cols):

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,因此它不会对您未选择的列进行完整的列处理。

如果您知道第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