2017-10-12 150 views
1

我试图从data lake存储中提取文件夹名并将其作为列输出到csv文件中。有没有办法通过USQL提取整个文件夹名称或部分文件夹名称?例如/input/Testing - 我需要TestingUSQL,将文件夹名提取到输出

我知道你可以提取文件名,并把它变成像这样的虚拟列:

// Filesets, file set with virtual column 

@q = 
EXTRACT rowId int, 
     filename string, 
     extension string 
FROM "/input/filesets example/{filename}.{extension}" 
USING Extractors.Tsv(); 


@output = 
SELECT filename, 
     extension, 
     COUNT(*) AS records 
FROM @q 
GROUP BY filename, 
     extension; 


OUTPUT @output TO "/output/output.csv" 
USING Outputters.Csv(); 

See pic here.

回答

2

您可以在路径中的任何地方使用{virtual_column}功能(不只是为文件名和扩展名),并在稍后进行投影。这将工作:

@q = EXTRACT 
     rowId int, 
     folder string, 
     filename string, 
     extension string 
    FROM "/input/{folder}/{filename}.{extension}" 
    USING Extractors.Tsv(); 

@output = 
    SELECT folder, 
     filename, 
     extension, 
     COUNT(*) AS records 
    FROM @q 
    GROUP BY folder, 
     filename, 
     extension; 

但是请注意,通过路径中使用虚拟列,您也越来越通配符功能(你将皮卡的所有文件夹中的情况下,你有一个以上的)...

+1

有一个在虚拟列上的谓词,以确保你只能得到你想要的文件夹,例如'WHERE folder ==“yourFolder”;' – wBob

+0

当我尝试运行上面的代码时,它说Virtual Column'文件夹'没有在EXTRACT语句中定义。 – FutureTony

+0

当我尝试运行上面的代码时,我在提取语句中添加了文件夹字符串,并且我的结果返回了一个空输入。 – FutureTony

相关问题