Spark SQL、DataFrames 和 Datasets 指南
Spark SQL 是 Spark 中用于结构化数据处理的模块。与基本的 Spark RDD API 不同,Spark SQL 提供的接口为 Spark 提供了关于数据结构和执行计算的更多信息。在内部,Spark SQL 使用这些额外的信息来进行额外的优化。有几种方式可以与 Spark SQL 进行交互,包括 SQL 和 Dataset 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 可在 Scala、Java、Python 和 R 中使用。 在 Scala 和 Java 中,DataFrame 由 Row
的 Dataset 表示。 在 Scala API 中,DataFrame
只是 Dataset[Row]
的类型别名。 同时,在 Java API 中,用户需要使用 Dataset<Row>
来表示 DataFrame
。
在本文档中,我们将经常把 Scala/Java 的 Row
的 Datasets 称为 DataFrames。