微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有 10K+ 宽列的 Spark-sql 表 - 如何加快执行速度

如何解决具有 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 管道:

    1. 语法拆分器 - 在开始时,即:更改“联合”行为 - 拆分为单独的 sql,或更高级 - 处理 sql,将列分组:A - 参与转换(数学等的一部分),B -未转换,然后创建多个列数较少的 sql
    2. 最后从那些较小的 sql 中混合(连接/联合)输出

Todo:寻找开销:过于复杂的计算/结构、计划中的新阶段等。

  • 开箱即用的命题 [3rd party],例如:H2O with ORC parser

H2O 有自己的 DF 表示 - 由 Cliff Click 完全重写。 H2O 支持 xxK+ 列。 H2O 计算 - 低级 - 没有 sql。期望值:相当高 - H2O 旨在使用 WIDE 列,并且列转换非常高效 - 它们有自己的索引机制等。

  • 开箱即用的命题:DB 并使用 DBA 解决问题

  • 开箱即用的命题:nosql 因为它是为宽列设计的


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 举报,一经查实,本站将立刻删除。