【发布时间】:2017-02-21 14:16:58
【问题描述】:
代码在 2000 个小文件 (~10-50 Kb) ~ 1 分钟内执行速度非常快。并行度 = 5。
@arenaData =
EXTRACT col1, col2, col3
FROM @in
USING Extractors.Tsv(quoting : true, skipFirstNRows : 1, nullEscape : "\\N", encoding:Encoding.UTF8);
@res =
SELECT col1, col2, col3
FROM @arenaData;
OUTPUT @res
TO @out
USING Outputters.Csv();
但如果我像这样更改代码,则需要 ~ 1 小时
@arenaData =
EXTRACT col1, col2, col3
FROM @in
USING Extractors.Tsv(quoting : true, skipFirstNRows : 1, nullEscape : "\\N", encoding:Encoding.UTF8);
@res =
SELECT
col1.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) AS col1_converted,
, col2, col3
FROM @arenaData;
OUTPUT @res
TO @out
USING Outputters.Csv();
为什么 .NET 调用这么慢?我需要将源 CSV 文件中的日期格式转换为“yyyy-MM-dd HH:mm:ss”吗?我怎样才能有效地做到这一点?
【问题讨论】:
-
这听起来不对。必须加载 CLR 并将本机代码调用到 C# 执行中会产生额外的开销,但这不应该是 60 倍更糟。您能否将工作链接(Microsoft dot com 的 usql)发给我,以便我可以请我们的工程团队进行调查?
-
在将问题发布到 stackoverflow 之前,我为 ADLA 支持团队创建了一张支持票。我为支持团队做了这些测试(JOB 的网址如下):没有 CLR ~2 分钟(MAXDOP = 5):arkadium.azuredatalakeanalytics.net/jobs/… 与一个 CLR 调用相同 ~ 38 分钟(MAXDOP = 5):arkadium.azuredatalakeanalytics.net/jobs/… 时间是改了,因为参数改了,但是问题还是存在。差别太大了
-
更多测试:使用 CLR + 并行度的相同作业从 5 增加到 20。经过的时间 ~10 分钟 arkadium.azuredatalakeanalytics.net/jobs/… 使用 CLR + 并行度的相同作业从 5 增加到 3。经过的时间~ 59 分钟 + 被我取消 arkadium.azuredatalakeanalytics.net/jobs/…
-
我从工程团队那里得到了根本原因。我目前正在旅行,但会在今晚/明天晚些时候回复。
-
@MichaelRys 看起来我明白发生了什么。我们有 2880 个小文件。对于他们每个人,我们都有 1 个顶点。我们总共有 2880 个顶点。我已经阅读了一些关于 ADLA 执行模型的信息。并且看起来当分析单元 (AU) 从一个顶点迁移到另一个顶点时,它会重新初始化 CLR COM 服务器。所以在我们的例子中,CLR 被重新初始化了 2880 次。以及我们在开始处理之前合并文件的解决方案。我对吗?我已经测试了这些假设,看起来它们是正确的......想听听你的解释。
标签: azure-data-lake u-sql