首页 文章

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

提问于
浏览
1

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

file1
file4

目录结构

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

我已将Files.txt内容解压缩到rowset @files,将目录中的文件解压缩到@filesDirectory rowset .

我的问题是,如果我用@files加入@filesDirectory,无论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

    我使用 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

  • 0

    您是否考虑在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);
    

相关问题