我正在尝试使用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 回答
我使用
INNER JOIN
和U-SQL连接语法,它是两个等号(==
),这对我有用 . 注意,文件仍在读取,但会从结果中过滤掉:我的结果与类似的文件夹结构:
您是否考虑在Extract表达式中使用文件列表?这不能是动态表达式或参数,因此您必须在每次运行之前根据/input/files.txt中的数据生成U-SQL脚本,但这样可以避免读取所有文件并在运行时过滤它们 .