U-SQL - 如何增加慢速UDF的parallelizm

时间:2017-02-03 17:49:18

标签: azure-data-lake u-sql

我正在处理表格"内容"用户定义的功能" TrasformData"

@result = 
SELECT Id,
       TrasformData(Data) AS TrasformedData
FROM Content;

表格"内容"很大(约100M记录)和#34; TrasformData"功能很慢。该功能非常复杂,一条记录大约需要20毫秒。

Azure Data Lake默认将我的查询拆分为25个顶点。这还不够。完成25 AU可能需要数小时。我想为这个过程分配至少200 AU,并尽快完成。据我所知,为此查询分配超过25 AU是没用的,直到它分成25个顶点。

我可以以某种方式增加查询的并行性吗?有谁可以帮我解决这个问题?任何选择都是可以接受的。

1 个答案:

答案 0 :(得分:3)

您有三种方法可以提高工作的并行度。

第一个是增加Content表的分配桶的数量(假设您正在使用一个表格,其中您的语句似乎表明了25个顶点)。

如果您正在使用HASH分发,则可以通过添加INTO x子句指定更大的数字(其中x是存储桶的数量,应小于约2000)。

其他两个选项类似:使用提示来欺骗系统使用更多节点。

一种方法是对前一个结果使用数据提示,声称它返回了非常多的行。这将欺骗系统重新分区数据,并将扩展未来的处理(将数字调整为您满意的数字):

@content = SELECT * FROM Content OPTION(ROWSIZE=1000000000);
@result = SELECT id, TransformData(Data) AS TransformData FROM @content;

另一种是明确更改分区:

@content = 
   SELECT * 
   FROM Content 
   OPTION(PARTITION(id)=(PARTITIONCOUNT=100));
@result = SELECT id, TransformData(Data) AS TransformData FROM @content;

然而,这两种方法都为您提供了一个固定的分配,如果您的数据更多,那么如果您的数据较少或不完整,则会进行全面分配。