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