2016-12-28 61 views
2

我想为多个文件编写相同的查询。这是可能以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

回答

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(); 
+0

谢谢... Basfilename对我来说是新的..编辑我的文章。我在帖子中给出的例子只是一个小例子。我必须为不同的文件编写多个查询,这些查询返回相同类型的输出,并且在大多数情况下文件结构不同。 – Ajay

+1

顺便说一句,“basefilename”不是保留关键字 - 它可以是任何有效的标识符。关键是它为输入文件名或路径的某个部分应用了一个列值(有时称为“虚拟列”)。 – saveenr

+0

Ohk .....我们可以写所有这些查询在SP或TVF,我可以传递表名称,列名作为参数?这可能吗? – Ajay

1

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

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

我做到了,因为我有一个结构类似的文件,但略有不同的列清单。标准的CSV提取器不适合执行此任务。用你想提取的所有可能的列名写出你的EXTRACT,它将填充这些值并忽略其余的值。

例如:

TABLE_1具有列A,B,和C. TABLE_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.

1

U形SQL不提供动态执行模式本身,而是它增加了一些功能,可以帮助一些动态场景。

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

直到这种能力变得可用,建议是:

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

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