转载请注明出处,谢谢合作~
Spark SQL, DataFrames 和 Datasets 编程指南
Spark SQL 是 Spark 中负责结构化数据处理的模块。不像基础的 Spark RDD API,Spark SQL 提供的接口为数据和计算执行期间的数据结构提供了更多的信息。在内部,Spark SQL 使用这些信息进行额外的优化。有几种方式可以和 Spark SQL 进行交互,包括 SQL 语言和 Dataset API。无论使用什么样的 API 或者语言来表达计算,在计算过程中的执行引擎是一样的。这样的统一使得开发者可以轻松的在不同的 API 之间来回切换,所需要关心的只是以何种方式表达一个计算流程更自然。
文档中所有的示例使用的相同的样例数据,而且可以通过 spark-shell
,pyspark
shell 或者sparkR
脚本执行。
SQL
一种使用 Spark SQL 的方式就是执行 SQL 查询语句。Spark SQL 还可以被用来读取已经存储在 Hive 中的数据。关于如何配置 Hive,参见 Hive Tables 章节。如果从另一种编程语言中使用 SQL,得到的结果会以 Dataset/DataFrame 的方式呈现。还可以通过命令行(command-line)或者 JDBC/ODBC 来使用 SQL 接口。
Datasets and DataFrames
一个 Dataset 就是一个分布式数据集合。Dataset 是在 Spark 1.6 版本加入的新接口,兼具 RDD 的长处(强类型,能够使用 lambda 函数) 和 Spark SQL 优化执行引擎的优势。一个 Dataset 可以通过 JVM 中的对象构建(constructed),之后就可以通过 transformation 算子 (map
, flatMap
, filter
, etc.) 进行操作。Dataset API 支持 Scala 和 Java 语言,不支持 Python 语言。但是出于 Python 的动态类型特性,许多 Dataset 的优势其实已经具备了(比如可以通过 row.columnName
按照名称访问一行中的某个字段),R 语言也是一样。
一个 DataFrame 就是一个对列进行命名之后的 Dataset。语义上等同于数据库中的一张表或者 R/Python 中的 dataframe,但是 DataFrame 在底层有更丰富的优化。DataFrame 可以通过丰富的数据源(sources)来构建,例如结构化数据文件,Hive 表,外部数据库,或者已存在的 RDD。DataFrame API 支持 Scala,Java,Python 和 R 语言,在 Scala 和 Java 中,一个 DataFrame 被表示为 Row
类型的 Dataset。在 Scala API 中,DataFrame
只是的一个别名。不过,在 Java API 中,用户需要用类型 Dataset<Row>
表示一个 DataFrame
。
在这篇文档中,会经常用 DataFrame 表示 Scala/Java 中的 Row
类型的 Datasets。