Spark SQL、DataFrames 和 Datasets 指南

Spark SQL 是 Spark 中用于结构化数据处理的模块。与基本的 Spark RDD API 不同,Spark SQL 提供的接口为 Spark 提供了关于数据结构和执行计算的更多信息。在内部,Spark SQL 使用这些额外的信息来进行额外的优化。有几种方式可以与 Spark SQL 进行交互,包括 SQL 和 Dataset API。当计算结果时,无论您使用哪种 API/语言来表达计算,都使用相同的执行引擎。这种统一意味着开发人员可以轻松地在不同的 API 之间切换,这取决于哪一个提供了最自然的表达给定转换的方式。

此页面上的所有示例都使用 Spark 发行版中包含的示例数据,可以在 spark-shellpyspark 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 对象 构建,然后使用函数式转换(mapflatMapfilter 等)进行操作。Dataset API 可在 ScalaJava 中使用。Python 不支持 Dataset API。但是由于 Python 的动态特性,Dataset API 的许多优点已经可用(例如,您可以自然地通过名称访问行的字段 row.columnName)。R 的情况类似。

DataFrame 是组织成命名列的Dataset。 从概念上讲,它等同于关系数据库中的表或 R/Python 中的数据框,但在底层具有更丰富的优化。 DataFrames 可以从各种 来源 构建,例如:结构化数据文件、Hive 中的表、外部数据库或现有的 RDD。 DataFrame API 可在 Scala、Java、PythonR 中使用。 在 Scala 和 Java 中,DataFrame 由 Row 的 Dataset 表示。 在 Scala API 中,DataFrame 只是 Dataset[Row] 的类型别名。 同时,在 Java API 中,用户需要使用 Dataset<Row> 来表示 DataFrame

在本文档中,我们将经常把 Scala/Java 的 Row 的 Datasets 称为 DataFrames。