我正在尝试使用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)
答案 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();
我的结果具有类似的文件夹结构:
答案 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);