动态查询可以用U-Sql编写

时间:2016-12-28 14:35:56

标签: u-sql

我想为多个文件编写相同的查询。这可以在U-SQL中编写动态查询,还是有办法消除重写同一段代码,如

Select count(*) as cnt from @table1;
Select count(*) as cnt from @table2;

可以替换为

Select count(*) as cnt from @dynamic

where @dynamic = table1, table2

3 个答案:

答案 0 :(得分:1)

(Azure Data Lake团队在这里)

您的问题提到从文件中读取,但您的示例显示了表格。如果你确实想要从文件中读取,那么EXTRACT语句支持"文件集"允许单个EXTRACT语句读取由模式指定的多个文件

@data =
    EXTRACT name string,
            age int,
            FROM "/input/{*}.csv"
    USING Extractors.Csv();

有时,数据需要包含数据所来自的文件名,因此您可以这样指定:

@data =
    EXTRACT name string,
            age int,
            basefilename string
            FROM "/input/{basefilename}.csv"
    USING Extractors.Csv();

答案 1 :(得分:1)

我使用自定义CSV提取器,使用CSV文件中的第一行将列与值匹配。

以下是要在代码后面或作为自定义程序集添加的要点:https://gist.github.com/serri588/ff9e3047d8341398df4aea7557f0a82c

我之所以这样做是因为我有一个具有相似结构但列略有不同的文件列表。标准CSV提取器不适合此任务。用您想要提取的所有可能的列名称编写EXTRACT,它将填充这些值并忽略其余的值。

例如:

表1包含A,B和C列。 表_2包含A,C和D列。

我想要A,B和C所以我的提取物将是

EXTRACT 
  A string, 
  B string, 
  C string
FROM "Table_{*}.csv"
USING new yourNamespace.CSVExtractor();

表1将填充所有三列,而表2将填充A和C,忽略D。

答案 2 :(得分:1)

U-SQL本身并不提供动态执行模式,但它添加了一些可以帮助解决某些动态场景的功能。

今天,您必须为TVF / SP的表类型参数提供确切的架构,但是,我们正在开发一种功能,它将为您提供灵活的架构参数,使您可以编写可以的TVF / SP应用于任何表格形状(只要您的查询不依赖于形状)。

在此功能可用之前,建议如下:

  1. 如果您知道可能的模式是什么:为每个可能的模式生成TVF / SP并相应地调用它。

  2. 使用任何SDK(C#,PowerShell,Java,Python,node.js)根据架构信息对脚本进行代码生成(假设您将其应用于可从中获取架构的对象)信息,而不仅仅是行集表达式。)