Spark SQL、DataFrames 和 Datasets 指南
Spark SQL 是一个用于结构化数据处理的 Spark 模块。与基本的 Spark RDD API 不同,Spark SQL 提供的接口为 Spark 提供了关于数据结构和正在执行的计算的更多信息。在内部,Spark SQL 使用这些额外信息执行额外的优化。与 Spark SQL 交互的方式有多种,包括 SQL 和 Dataset API。计算结果时,无论您使用哪种 API/语言来表达计算,都使用相同的执行引擎。这种统一意味着开发人员可以根据哪种 API 能最自然地表达给定转换,轻松地在不同 API 之间切换。
此页面上的所有示例都使用 Spark 发行版中包含的示例数据,可以在 spark-shell
、pyspark
shell 或 sparkR
shell 中运行。
SQL
Spark SQL 的一个用途是执行 SQL 查询。Spark SQL 也可以用于从现有的 Hive 安装中读取数据。有关如何配置此功能的更多信息,请参阅Hive 表部分。当从另一种编程语言中运行 SQL 时,结果将作为 Dataset/DataFrame 返回。您还可以通过 命令行或通过 JDBC/ODBC 与 SQL 接口交互。
Datasets 和 DataFrames
Dataset 是数据的分布式集合。Dataset 是 Spark 1.6 中新增的一个接口,它结合了 RDD 的优点(强类型、能够使用强大的 lambda 函数)和 Spark SQL 优化执行引擎的优点。Dataset 可以从 JVM 对象中构建,然后使用函数式转换(例如 map
、flatMap
、filter
等)进行操作。Dataset API 在 Scala 和 Java 中可用。Python 不支持 Dataset API。但由于 Python 的动态特性,Dataset API 的许多优点已经可以利用(即,您可以自然地通过名称访问行的字段,例如 row.columnName
)。R 的情况类似。
DataFrame 是一个按命名列组织的 Dataset。它在概念上等同于关系数据库中的表或 R/Python 中的数据框,但在内部具有更丰富的优化。DataFrames 可以从多种来源构建,例如:结构化数据文件、Hive 中的表、外部数据库或现有 RDD。DataFrame API 在 Python、Scala、Java 和 R 中可用。在 Scala 和 Java 中,DataFrame 由 Row
的 Dataset 表示。在 Scala API 中,DataFrame
只是 Dataset[Row]
的类型别名。而在 Java API 中,用户需要使用 Dataset<Row>
来表示 DataFrame
。
在本文档中,我们将经常把 Scala/Java 中 Row
的 Dataset 称为 DataFrame。