Azure 为什么获取Vertex失败:多个目录上的列太多,而不是单个文件?

Azure 为什么获取Vertex失败:多个目录上的列太多,而不是单个文件?,azure,azure-data-lake,u-sql,Azure,Azure Data Lake,U Sql,我正在使用Azure Data Lake Store和Azure Data Lake Analytics。我的数据目录以YYYY、MM、DD格式拆分,其中的文件包含在日期目录中,文件名为YYYYMMDD_Filename.csv。每个目录一个文件 文件本身是带有逗号分隔符(无双引号)的UTF-8。它们包含一个标题行,行由CR LF分隔 在Data Lake预览中,我可以清楚地查看文件而不会出现问题。我也可以在一个文件上运行下面的代码,而且效果很好。所有行都被提取并输出到单个CSV文件 然而,当我

我正在使用Azure Data Lake Store和Azure Data Lake Analytics。我的数据目录以YYYY、MM、DD格式拆分,其中的文件包含在日期目录中,文件名为YYYYMMDD_Filename.csv。每个目录一个文件

文件本身是带有逗号分隔符(无双引号)的UTF-8。它们包含一个标题行,行由CR LF分隔

在Data Lake预览中,我可以清楚地查看文件而不会出现问题。我也可以在一个文件上运行下面的代码,而且效果很好。所有行都被提取并输出到单个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();
DECLARE@dir string=“/raw/meh/product/test/report/”;
声明@file_set_path2 string=@dir+“{Date:yyyy}/{Date:MM}/{Date:dd}/{*}.csv”;
@数据=
提取日期日期时间,//虚拟文件集列
Cat1字符串,
Cat2字符串,
Cat3字符串,
Cat4字符串,
Cat5字符串,
Cat6字符串,
Cat7字符串
从@file\u set\u路径2
使用提取器.Text(引用:false,分隔符:',',skipFirstNRows:1);
@结果=
挑选*
来自@data
其中Date>=DateTime.Now.AddDays(-2)

日期看起来确实可疑


文本字段显示它在哪里找到了它不期望的“错误列”。这是文件的数据或头的一部分吗?如果此文件是唯一的文件,则此文件有效吗?

需要在此处包含两个日期。一个用于“我的数据”中的“日期”字段,另一个用于表达式的“虚拟文件集”列

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();
DECLARE@dir string=“/raw/meh/product/test/report/”;
声明@file_set_path2 string=@dir+“{date:yyyy}/{date:MM}/{date:dd}/{*}.csv”;
@数据=
提取日期日期时间,//日期的我的实际字段
Cat1字符串,
Cat2字符串,
Cat3字符串,
Cat4字符串,
Cat5字符串,
Cat6字符串,
Cat7字符串,
日期日期时间//虚拟文件集列(实际!)
从@file\u set\u路径2
使用提取器.Text(引用:false,分隔符:',',skipFirstNRows:1);
@结果=
挑选*
来自@data
其中Date>=DateTime.Now.AddDays(-2)

你一回答Date就知道了。问题是我需要2个日期字段。一个用于“我的数据”中的“实际日期”字段,另一个用于表达式的“日期”虚拟字段。现在它起作用了。我认为它可以是一个相同的列,只是为了代码的可读性和可维护性,我会避免两列名称相同,只是大小写不同。另外,尽量使你的列名更有意义,例如,它们应该(至少)由两部分组成,以描述它们真正代表的内容。对您的专栏有两个建议,一个是
catDate
,另一个是
extractDate
sourceDate
。如果您的示例代码只是用于演示,但您的真实代码更具描述性,我对此表示歉意。我为示例屏蔽了它们。谢谢你的建议!我不知道我能否避免这两次约会。我两个都需要。我想他们可以用不同的名字。我假设虚拟文件集列可以是数据中日期字段的同一列。我错了。