为什么我得到Vertex失败:多个目录上的列太多而不是单个文件?

时间:2018-01-24 20:22:46

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

我在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();

错误

  • 行分隔符:0x0
  • 列分隔符:0x2C
  • TEXT:\ r \ n2018-01-23 .... ### 20 \ r \ n2018-0

我唯一可以想到的是它显示错误\ r \ n并引用错误行的事实,它清楚地显示了错误中的下一行数据。这没有意义,因为没有正则表达式的相同代码(即:{YYYY} / {MM}和Date)根本不会出错。

当我使用正则表达式并将所有行合并为一行时,Azure Data Lake Analytics是否将我的UTF-8 CR LF文件转换为其他内容?然后出错,因为它从8个字段变为10808个字段?

无论如何要解决这个问题?这让我疯了,因为显然每个文件都可以使用类似的查询在孤岛中访问。分析文件看起来符合UTF-8,逗号分隔和所有jive。

2 个答案:

答案 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;这是没有预料到的。这是文件的数据或标题的一部分吗?如果它是唯一的文件,这个文件是否有效?