如何解决具有 10K+ 宽列的 Spark-sql 表 - 如何加快执行速度
对于如何在具有 10K+ 列的表上加速 Spark-sql,您有什么建议吗?
TL;TR:。 我必须通过 spark-sql 处理来自 ORC 文件的 10K+ 列的宽表来解决性能问题。我注意到这种改进/CR:https://issues.apache.org/jira/browse/SPARK-25643
Spark 架构旨在处理长而窄的数据 (
建议的解决方案:
-
简单:代替 10K+ 列上的一个大 sql - 创建多个 sql - 在临时表中输出 - 然后从临时表连接/联合到最后一个。
-
SPARK:“解析器/计划构建器”——不确定我的命名是否正确,需要多研究一下。 我运行这个测试:
val n = 1000
val values = (1 to n).map(_.toString).mkString(",")
val columns = (1 to n).map("column" + _).mkString(",")
val query = s" SELECT $columns FROM VALUES ($values) T($columns) WHERE 1=2 AND 1 IN ($columns) GROUP BY $columns ORDER BY $columns".stripMargin
spark.time(spark.sql(query))
输出:
列 | 预期线性 [ms] | 真实 [毫秒] | 真实 [分钟] |
---|---|---|---|
100 | 200 | 183 | 0.003 |
250 | 500 | 306 | 0.005 |
500 | 1000 | 524 | 0.009 |
1000 | 2000 | 1514 | 0.025 |
2500 | 5000 | 7922 | 0.132 |
5000 | 10000 | 31131 | 0.519 |
10000 | 20000 | 134429 | 2.240 |
12500 | 25000 | 200568 | 3.343 |
15000 | 30000 | 348068 | 5.801 |
20000 | 40000 | 595804 | 9.930 |
尝试从 O(N^2) => O(N) ..
-
SPARK:自动分离器 - 将 2 个新阶段引入 Spark 管道:
Todo:寻找开销:过于复杂的计算/结构、计划中的新阶段等。
- 开箱即用的命题 [3rd party],例如:H2O with ORC parser
H2O 有自己的 DF 表示 - 由 Cliff Click 完全重写。 H2O 支持 xxK+ 列。 H2O 计算 - 低级 - 没有 sql。期望值:相当高 - H2O 旨在使用 WIDE 列,并且列转换非常高效 - 它们有自己的索引机制等。
Spark 命题非常大/影响现有的 sql 功能 - 不保证这在未来会起作用。
PoC plan:
1. Create: 3 tables - one with 10K columns
2. sql that contains 3+ unions,5+calculations
3. Multi sqls 3+ (splitting unions) +1 final JOIN
3. Compare timing 2. and 3.
注意:对于火花分离器解决方案来说,这个 PoC 可能是一个足够好的指标。 期望:假设当前时间是指数级 => 更改为时间总和,一切都将取决于最终加入(不应有任何其他操作)。
否则,基本上,我在泡菜:请提供任何解决方法的建议。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。