我正在尝试使用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列?
另外,如果我在这里走错路,请告诉我。这与我以前的情况大不相同。
答案 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
表达式(不包含虚拟列),因此您无需手动执行此操作: