使用其他表过滤提取器中的数据

时间:2018-07-10 11:00:20

标签: azure-data-lake u-sql

我正在尝试使用csv自定义提取器从多个文件中提取数据,该提取器使用基于其他文件内容的过滤器。 例如 Files.txt内容

file1
file4

目录结构

/file1/file.txt
/file2/file.txt
/file3/file.txt
/file4/file.txt

我已将Files.txt内容提取到行集@files,并将目录中的文件提取到@filesDirectory行集。

我的问题是,如果我将@filesDirectory和@files一起加入,则无论Files.txt中有什么文件,都将读取所有文件...我只想读取在其上指定的文件。 但是,如果我指定文件(不加入两个行集),它将起作用! 有帮助吗?


以下是查询:

DECLARE @input string = @"/{dirname}/file.txt";
DECLARE @filterFile = @"/fileFilter.txt";
 @inputData =

        EXTRACT 
            dirname string,
            content string
        FROM @input
        USING Extractors.Text(delimiter : '\n', quoting : false);

 @inputFilter =
        EXTRACT 
            directories string                
        FROM @filterFile
        USING Extractors.Text();

@result = SELECT * FROM @inputData AS id
            LEFT JOIN @inputFilter AS if ON (id.dirname = id.directories)

2 个答案:

答案 0 :(得分:0)

我使用了INNER JOIN和U-SQL连接语法,这是两个等号(==),这对我有用。注意,文件仍已读,但已从结果中滤除:

DECLARE @inputFile string = "/input/{dirName}/file.txt";

@input =
    EXTRACT dirName string,
            content string
    FROM @inputFile
    USING Extractors.Csv();


@inputFilter =
    EXTRACT directories string
    FROM "/input/files.txt"
    USING Extractors.Csv();


@output =
    SELECT *
    FROM @input
         INNER JOIN
             @inputFilter
         ON dirName == directories
    WHERE dirName LIKE "file%";


OUTPUT @output
TO "/output/output.csv"
USING Outputters.Csv();

我的结果具有类似的文件夹结构:

My results

答案 1 :(得分:0)

您是否考虑过在“提取”表达式中使用文件列表?这不能是动态表达式或参数,因此您必须在每次运行之前基于/input/files.txt中的数据生成U-SQL脚本,但这将避免读取所有文件并在运行时对其进行过滤

DECLARE @input string = @"/{dirname}/file.txt";
DECLARE @filterFile = @"/fileFilter.txt";
@inputData =

    EXTRACT 
        dirname string,
        content string
    FROM "/file1/file.txt",
         "/file4/file.txt"
    USING Extractors.Text(delimiter : '\n', quoting : false);