Spark -9:Spark SQL, DataFrames and Datasets 编程指南

来源:互联网 发布:淘宝全球购关税怎么交 编辑:程序博客网 时间:2024/09/21 08:17

翻译:http://spark.apache.org/docs/latest/sql-programming-guide.html


概述

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 and DataFrames

Datasets是数据的分布式集合。数据集是在Spark 1.6中添加的一个新接口,它提供了RDD的优点(强类型化,使用强大的lambda函数的能力)以及Spark SQL优化的执行引擎的优点。数据集可以从JVM对象构建,然后使用函数转换(map,flatMap,filter等)操作。Scala和Java中提供了Dataset API。Python没有对Dataset API的支持。但是由于Python的动态特性,Dataset API的许多优点已经可用(即,您可以通过名称自然地访问行的字段row.columnName)。R的情况是类似的。


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

Starting Point: SparkSession


Spark中所有功能的入口点是SparkSession类。要创建基本的SparkSession,只需使用SparkSession.builder():
import org.apache.spark.sql.SparkSession;SparkSession spark = SparkSession  .builder()  .appName("Java Spark SQL basic example")  .config("spark.some.config.option", "some-value")  .getOrCreate();


在Spark “examples / src / main / java / org / apache / spark / examples / sql / JavaSparkSQLExample.java”中查找完整的示例代码。Spark 2.0中的SparkSession为Hive功能提供了内置支持,包括使用HiveQL编写查询,访问Hive UDF以及从Hive表中读取数据的能力。要使用这些功能,您不需要具有现有的Hive设置。

Creating DataFrames


使用SparkSession,应用程序可以从现有RDD,Hive表或Spark数据源创建DataFrames。例如,以下内容根据JSON文件的内容创建DataFrame:
import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;Dataset<Row> df = spark.read().json("examples/src/main/resources/people.json");// Displays the content of the DataFrame to stdoutdf.show();// +----+-------+// | age|   name|// +----+-------+// |null|Michael|// |  30|   Andy|// |  19| Justin|// +----+-------+
DataFrames为Scala,Java,Python和R中的结构化数据操作提供了特定领域的语言。如上所述,在Spark 2.0中,DataFrames只是Scala和Java API中的Rows数据集。这些操作也称为“非类型转换”,与带有强类型化Scala / Java数据集的“类型转换”相反。
这里我们包括使用数据集的结构化数据处理的一些基本示例:
// col("...") is preferable to df.col("...")import static org.apache.spark.sql.functions.col;// Print the schema in a tree formatdf.printSchema();// root// |-- age: long (nullable = true)// |-- name: string (nullable = true)// Select only the "name" columndf.select("name").show();// +-------+// |   name|// +-------+// |Michael|// |   Andy|// | Justin|// +-------+// Select everybody, but increment the age by 1df.select(col("name"), col("age").plus(1)).show();// +-------+---------+// |   name|(age + 1)|// +-------+---------+// |Michael|     null|// |   Andy|       31|// | Justin|       20|// +-------+---------+// Select people older than 21df.filter(col("age").gt(21)).show();// +---+----+// |age|name|// +---+----+// | 30|Andy|// +---+----+// Count people by agedf.groupBy("age").count().show();// +----+-----+// | age|count|// +----+-----+// |  19|    1|// |null|    1|// |  30|    1|// +----+-----+
以编程方式运行SQL查询

SparkSession上的sql函数使应用程序以编程方式运行SQL查询,并以数据集<Row>返回结果。

port org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;// Register the DataFrame as a SQL temporary viewdf.createOrReplaceTempView("people");Dataset<Row> sqlDF = spark.sql("SELECT * FROM people");sqlDF.show();// +----+-------+// | age|   name|// +----+-------+// |null|Michael|// |  30|   Andy|// |  19| Justin|// +----+-------+



0 0
原创粉丝点击