使用其他 table 从提取器中过滤数据

Filter data from extractor using other table

我正在尝试使用 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)

我使用了 INNER JOIN 和 U-SQL 连接语法,它是两个等号 (==),这对我有用。注意文件仍然是 read 但被过滤掉了结果:

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

我的文件夹结构相似的结果:

您是否考虑过在 Extract 表达式中使用文件列表?这不能是动态表达式或参数,因此您必须根据 /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);