我在Azure Data Lake Analytics中使用Azure Data Lake Store。我的数据目录在YYYY,MM,DD中拆分,文件包含在日期目录中,格式为YYYYMMDDD_Filename.csv。每个目录一个文件。
文件本身是带有逗号分隔符的UTF-8(没有双引号)。它们包含标题行,行由CR LF分隔。
我可以在Data Lake Preview中清楚地查看文件而不会出现问题。我也可以在一个文件上运行下面的代码,它工作正常。获取所有行并将其输出到单个CSV文件。
然而,当我使用相同的代码并使用诸如Date之类的虚拟列进入表达式以便聚合多个文件时。在找到所有文件并尝试获取/聚合它找到的每个文件中的行后,它会给我顶点错误。
要考虑的事情
代码示例
DECLARE @dir string = "/raw/meh/product/test/report/";
DECLARE @file_set_path2 string = @dir + "{Date:yyyy}/{Date:MM}/{Date:dd}/{*}.csv";
@data =
EXTRACT Date DateTime, // virtual file set column
Cat1 string,
Cat2 string,
Cat3 string,
Cat4 string,
Cat5 string,
Cat6 string,
Cat7 string
FROM @file_set_path2
USING Extractors.Text(quoting: false, delimiter: ',', skipFirstNRows:1);
@result =
SELECT *
FROM @data
WHERE Date >= DateTime.Now.AddDays(-2)
AND Date <= DateTime.Now.AddDays(-1)
AND Cat1 != "Sales";
OUTPUT @result
TO "/output/meh/product/test/report/TestData.csv"
USING Outputters.Csv();
错误
我唯一可以想到的是它显示错误\ r \ n并引用错误行的事实,它清楚地显示了错误中的下一行数据。这没有意义,因为没有正则表达式的相同代码(即:{YYYY} / {MM}和Date)根本不会出错。
当我使用正则表达式并将所有行合并为一行时,Azure Data Lake Analytics是否将我的UTF-8 CR LF文件转换为其他内容?然后出错,因为它从8个字段变为10808个字段?
无论如何要解决这个问题?这让我疯了,因为显然每个文件都可以使用类似的查询在孤岛中访问。分析文件看起来符合UTF-8,逗号分隔和所有jive。
答案 0 :(得分:1)
此处需要包含两个日期。一个用于我的数据中的日期字段,另一个用于表达式的虚拟文件集列。
DECLARE @dir string = "/raw/meh/product/test/report/";
DECLARE @file_set_path2 string = @dir + "{date:yyyy}/{date:MM}/{date:dd}/{*}.csv";
@data =
EXTRACT Date DateTime, // My actual field for date
Cat1 string,
Cat2 string,
Cat3 string,
Cat4 string,
Cat5 string,
Cat6 string,
Cat7 string,
date DateTime // virtual file set column (ACTUAL!)
FROM @file_set_path2
USING Extractors.Text(quoting: false, delimiter: ',', skipFirstNRows:1);
@result =
SELECT *
FROM @data
WHERE Date >= DateTime.Now.AddDays(-2)
AND Date <= DateTime.Now.AddDays(-1)
AND Cat1 != "Sales";
OUTPUT @result
TO "/output/meh/product/test/report/TestData.csv"
USING Outputters.Csv();
答案 1 :(得分:0)
这看起来确实很可疑。
TEXT字段显示它找到&#34;错误列的位置&#34;这是没有预料到的。这是文件的数据或标题的一部分吗?如果它是唯一的文件,这个文件是否有效?