U-SQL - 如何为慢速 UDF 增加并行度

U-SQL - How to increase parallelizm for a slow UDF

我正在处理 table "Content" 用户定义函数 "TrasformData"

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

table "Content" 很大(大约 100M 条记录),"TrasformData" 功能很慢。该功能非常复杂,一条记录大约需要20毫秒。

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

我能否以某种方式提高查询的并行度?谁能帮我解决这个问题?任何选项都是acceptable.

您可以通过三个选项来提高作业的并行度。

第一个是增加 Content table 的分布桶数(假设您使用的是 table,您关于 25 个顶点的陈述似乎表明了这一点)。

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

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

一种是对先前的结果使用数据提示来声明它 returns 确实有大量行。这将欺骗系统 re-partition 数据并将扩展未来的处理(将数字调整为您满意的数字):

@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;

然而,这两种方法都为您提供固定分配,如果您的数据较少,则分配过度;如果数据多,则分配不足。