如何仅使用U-SQL和文件中的某些字段将大文件分区为文件/目录?

时间:2016-12-27 19:16:18

标签: azure-data-lake u-sql

我有一个非常大的CSV,其中每行包含客户和商店ID,以及交易信息。当前测试文件大约为40 GB(大约2天),因此对于选择查询的任何合理返回时间,分区是绝对必须的。

我的问题是:当我们收到一个文件时,它包含多个商店的数据。我想使用“虚拟列”功能将此文件分成相应的目录结构。该结构是“/ Data / {CustomerId} / {StoreID} /file.csv”。

我还没有使用OUTPUT语句。因此使用声明:

// Output to file
OUTPUT @dt
TO @"/Data/{CustomerNumber}/{StoreNumber}/PosData.csv"
USING Outputters.Csv();

它出现以下错误:

Bad request. Invalid pathname. Cosmos Path: adl://<obfuscated>.azuredatalakestore.net/Data/{0}/{1}/68cde242-60e3-4034-b3a2-1e14a5f7343d

有没有人尝试过同样的事情?我试图连接字段中的outputpath,但这是不行的。我想把它作为一个函数(UDF)来获取两个ID并过滤整个数据集,但这看起来非常低效。

提前感谢您阅读/回复!

1 个答案:

答案 0 :(得分:3)

目前,U-SQL要求必须在编译时理解脚本的所有文件输出。换句话说,无法根据输入数据创建输出文件。

基于数据的动态输出是我们积极致力于2017年晚些时候发布的内容。

同时,直到动态输出功能可用,完成所需的模式需要使用两个脚本

第一个脚本将使用GROUP BY来标识CustomerNumber和StoreNumber的所有唯一组合,并将其写入文件。

然后通过使用脚本或使用我们的SDK编写的工具,下载以前的输出文件,然后以编程方式创建第二个U-SQL脚本,该脚本对每对CustomerNumber和StoreNumber都有一个显式的OUTPUT语句