U-SQL语句中的动态FROM

时间:2017-08-18 10:27:59

标签: azure-data-lake u-sql

我正在尝试在U-SQL中生成动态FROM子句,以便我们可以根据以前的查询结果从不同的文件中提取数据。这是这样的:

@filesToExtract = SELECT whatevergeneratesthepaths from @foo; <-- this query generates a rowset with all the file we want to extract like: [/path/file1.csv, /path/file2.csv]
SELECT * FROM @filesToExtract; <-- here we want to extract the data from file1 and file2

我担心这种动态查询还不支持,但有人可以帮我指出实现这一目标的方法吗?似乎唯一可行的方法是生成另一个U-SQL脚本并在之后执行它。

提前致谢。

1 个答案:

答案 0 :(得分:2)

如果您希望动态检索文件名并将其传递给EXTRACT语句或表/行集的名称并传递给SELECT的FROM子句,那么您的问题并不完全清楚。或两者。

通常,您无法从U-SQL表达式动态生成源名称。您可能希望在此处http://aka.ms/adlfeedback提交功能请求,以获取动态或静态参数化的来源。

话虽如此,根据您的具体要求,可能有一些方法可以实现您的目标,而无需您所描述的解决方案。

例如,您可以将代码编写为参数化表值函数,然后使用不同的脚本传递不同的行集,或者 - 如果您可以静态地决定选择哪个行集 - 则可以使用IF语句。

这是一个伪代码示例:

DECLARE EXTERNAL @someconditionparameter Boolean = true;

IF (@someconditionparameter) THEN
   @data = EXTRACT a int, b string FROM @fileset1 USING Extractors.Csv();
ELSE
   @data = EXTRACT a int, b string FROM @file2 USING ...;
END;

@results = MyTableValuedFunction (@data);
...

如果您的文件采用不同的模式化,您可以在TVF中使用灵活的列集(当前处于预览状态,请参阅发行说明)来处理行集模式的可变性。