Spark-30发布啦改进SQL弃Python-2更好的兼容ANSI-SQL性能大幅提升

40次阅读

共计 2809 个字符,预计需要花费 8 分钟才能阅读完成。

Apache Spark 3.0.0正式发布啦,Apache Spark 3.0是在 Spark 2.x 的基础上开发的,带来了新的想法和功能。

Spark是一个开源的大数据处理、数据科学、机器学习和数据分析工作负载的统一引擎,自 2010 年首次发布以来,已经成长为最活跃的开源项目之一;支持 Java、Scala、Python、R 等语言,并为这些语言提供了相关的SDK

Spark 3.0中的 Spark SQL 是这个版本中最活跃的组件,46%的已解决的问题都是是针对 Spark SQL 的,包括结构化流和 MLlib,以及高层API,包括SQLDataFrames。在经过了大量优化后,Spark 3.0的性能比 Spark 2.4 快了大约 2 倍。

Python是目前 Spark 上使用最广泛的语言;针对 Python 语言提供的 PySparkPyPI上的月下载量超过 500 万。在Spark 3.0 中,对 PySpark 的功能和可用性做了不少改进,包括用 Python 类型提示重新设计 pandas UDF API,新的pandas UDF 类型,以及更多的 Pythonic 错误处理。

以下便是 Spark 3.0 中的功能亮点:包括 自适应查询执行,动态分区修剪,ANSI SQL合规性,pandas API的重大改进,结构化流的新 UI,调用R 用户定义函数的速度提高了 40 倍,加速器感知的调度器,以及 SQL 参考文档

把这些功能按照模块来划分就可以分为以下几个模块:

  • core、Spark SQL、Structured Streaming
  • MLlib
  • SparkR
  • GraphX
  • 放弃 Python 2R 3.4以下的版的支持;
  • 修复一些已知的问题;

core、Spark SQL、Structured Streaming

突出功能

  1. 加速器感知调度器;
  2. 自适应查询;
  3. 动态分区修剪;
  4. 重新设计的 pandas UDF API 与类型提示;
  5. 结构化流用户界面;
  6. 目录插件 API 的支持;
  7. 支持Java 11
  8. 支持Hadoop 3
  9. 能够更好的兼容ANSI SQL

性能提升

  1. 自适应查询;
  2. 动态分区修剪;
  3. 优化 9 项规则;
  4. 最小化表缓存同步性能优化;
  5. 将聚合代码分割成小函数;
  6. INSERTALTER TABLE ADD PARTITION命令中增加批处理;
  7. 允许聚合器注册为UDAF

SQL 兼容性增强

  1. 使用 Proleptic Gregorian 日历;
  2. 建立 Spark 自己的日期时间模式定义;
  3. 为表插入引入 ANSI 存储分配策略;
  4. 在表插入中默认遵循 ANSI 存储分配规则;
  5. 添加一个 SQLConfspark.sql.ansi.enabled,用于开启ANSI 模式;
  6. 支持聚合表达式的 ANSI SQL 过滤子句;
  7. 支持 ANSI SQL OVERLAY 功能;
  8. 支持 ANSI 嵌套方括号内的注释;
  9. 超出整数范围时抛出异常;
  10. 区间算术运算的溢出检查;
  11. 当无效字符串被转换为数字类型时,抛出异常;
  12. 使用区间乘法和除法的溢出行为与其他操作一致;
  13. chardecimal添加 ANSI 类型的别名;
  14. SQL解析器定义了 ANSI 兼容的保留关键字;
  15. ANSI 模式开启时,禁止使用保留关键字作为标识符;
  16. 支持 ANSI SQL.LIKE...ESCAPE 语法;
  17. 支持 ANSI SQL 布尔 - 谓词语法;

PySpark 增强版

  1. 重新设计的pandas UDFs,并提供类型提示;
  2. 允许 Pandas UDF 采用 pd.DataFrames 的迭代器;
  3. 支持 StructType 作为 Scalar Pandas UDF 的参数和返回类型;
  4. 通过 Pandas UDFs 支持Dataframe Cogroup
  5. 增加 mapInPandas,允许DataFrames 的迭代器;
  6. 部分 SQL 函数也应该取数据列名;
  7. PySparkSQL异常更加 Pythonic 化;

扩展性增强

  1. 目录插件;
  2. 数据源 V2 API 重构;
  3. Hive 3.03.1 的版本的元存储支持;
  4. Spark 插件接口扩展到驱动程序;
  5. 可通过自定义指标来扩展 Spark 指标系统;
  6. 为用于扩展列式处理支持提供了开发者API
  7. 使用 DSV2 的内置源迁移:parquet, ORC, CSV, JSON, Kafka, Text, Avro
  8. 允许在 SparkExtensions 中注入函数;

连接器增强

  1. 在数据源表中支持spark.sql.statistics.fallBackToHdfs
  2. 升级 Apache ORC1.5.9
  3. 支持 CSV 数据源的过滤器;
  4. 使用本地数据源优化插入分区 Hive 表;
  5. 升级 Kafka2.4.1
  6. 新的内置二进制文件数据源,新的无操作批处理数据源和无操作流接收器;

K8s 中的原生 Spark 应用

  1. 使用 K8S 进行更灵敏的动态分配,并在 K8S 上增加对 SparkKerberos支持;
  2. 使用 Hadoop 兼容的文件系统支持客户端依赖性;
  3. k8s 后台增加可配置的认证秘密源;
  4. 支持 K8s 的子路径挂载;
  5. PySpark Bindings for K8S 中把 Python 3 作为默认选项;

MLib

  1. Binarizer StringIndexerStopWordsRemoverPySpark QuantileDiscretizer 添加了多列支持;
  2. 支持基于树的特征转换;
  3. 增加了两个新的评估器 MultilabelClassificationEvaluatorRankingEvaluator
  4. 增加了 PowerIterationClusteringR API
  5. 添加了用于跟踪 ML 管道状态的 Spark ML 监听器;
  6. Python 中的梯度提升树中添加了带有验证集的拟合。
  7. 增加了 RobustScaler 变压器;
  8. 添加了因子化机器分类器和回归器;
  9. 增加了高斯奈夫贝叶斯和互补奈夫贝叶斯;

此外,在 Spark 3.0 中,Pyspark中的多类逻辑回归现在将返回 LogisticRegressionSummary,而不是其子类BinaryLogisticRegressionSummarypyspark.ml.param.shared.Has* mixins 也不再提供任何 set(self, value)setter 方法,而是使用各自的 self.set(self., value) 代替。

SparkR

通过矢量化的 R gapply()dapply()createDataFramecollect() 提高性能来优化 SparkR 的互操作性;

还有 “eager execution “ 的 R shellIDE 以及迭代聚类的R API

弃用组件

  1. 弃用 Python 2 的支持;
  2. 弃用 R 3.4 以下版本的支持;
  3. 弃用Deprecate UserDefinedAggregateFunction

此次的 Spark 3.0 也算是一个大版本,不仅带来了不少新功能、也修复了很多已知的问题,在性能上有了很大的提升。

自从 Python 官方宣布停止维护 Python2 之后,各大组件也是纷纷响应,都停止了 Python 的支持,各位项目学习 Python 的小伙伴也是可以考虑直接学习 Python 3 了。

老夫虽不正经,但老夫一身的才华!关注我,获取更多编程科技知识。

正文完
 0