1. Spark SQL的Java开发包
Spark SQL提供Java的开发包,当前最新版本是2.1.0版本:spark-sql_2.11-2.1.0.jar,可以从下面链接下载:
http://central.maven.org/maven2/org/apache/spark/spark-sql_2.11/2.1.0/spark-sql_2.11-2.1.0.jar
或者通过Maven配置:
* Spark 2.1.0版本需要Java 7或以上,本文使用Java 1.8.0_72版本
2. SparkSession
创建一个基本的SparkSession,只要使用SparkSession.builder(),它是使用所有Spark SQL功能的入口点:
* 必须调用master(String master)方法指定主节点URL,本例使用local[*],表示本机多线程,线程数与服务器核数相同,具体请参考以下链接:
http://spark.apache.org/docs/latest/submitting-applications.html#master-urls
* 如果没有指定主节点URL的话,运行时会遇到以下错误:
Spark 2.0版本开始,SparkSession内置支持Hive的特性,包括使用HiveQL进行写查询,访问Hive的UDFs和从Hive表读取数据,不需要部署一个Hive的环境。
3. 创建DataFrames
使用SparkSession可以通过一个RDD、Hive表或者Spark数据源创建DataFrames,例如以下代码通过读取一个JSON文件创建一个DataFrame,然后调用show()方法显示内容:
4. 非类型化数据集操作(DataFrame操作)
DataFrames提供了Scala、Java、Python和R语言对结构化数据的操作。以下是一些使用Datasets对结构化数据进行处理的基本例子:
5. 以编程方式运行SQL查询
SparkSession的sql方法能够以编程方式运行SQL查询并返回Dataset<Row>。
例如以下例子:
6. 全局临时视图
Spark SQL的临时视图是当前session有效的,也就是视图会与创建该视图的session终止而失效。如果需要一个跨session而且一直有效的直到Spark应用终止才失效的临时视图,可以使用全局临时视图。全局临时视图是与系统保留数据库global_temp绑定,所以使用的时候必须使用该名字去引用,例如,SELECT * FROM global_temp.view1。
7. 创建Datasets
Datasets类似于RDDs,然而,Datasets使用了一个专门的编码器Encoder来序列化对象而不是使用Java的序列化或Kryo。这些专门的编码器使用的格式允许Spark执行像过滤filtering、排序sorting和哈希hashing等操作而不需要把对象反序列化成字节。
8. Datasets与RDDs的相互转换
Spark SQL支持2种不同的方法把RDDs转换为Datasets。第一种是使用反射获取RDD的Schema,当知道schema的时候,使用基于反射的方法会让代码更加简明而且效果也更好。第二种是通过编程接口指定schema,这种方法会使代码冗长,但是可以在运行时才知道数据列以及其类型的情况下事先构造Datasets。
8.1 使用反射获取Schema
Spark SQL支持将JavaBean的RDD自动转换成DataFrame。目前的Spark SQL版本不支持包含Map field(s)的JavaBeans,但嵌套的JavaBeans和List或者Array fields是支持的。可以通过创建一个实现Serializable接口和包含所有fields的getters和setters方法的类来创建一个JavaBean。
8.2 通过编程接口指定Schema
当JavaBean不能被事先定义的时候,通过编程创建Dataset<Row>需要三个步骤:
* 参考Spark SQL官方链接:http://spark.apache.org/docs/latest/sql-programming-guide.html#getting-started
TO BE CONTINUED...O(∩_∩)O
Spark SQL提供Java的开发包,当前最新版本是2.1.0版本:spark-sql_2.11-2.1.0.jar,可以从下面链接下载:
http://central.maven.org/maven2/org/apache/spark/spark-sql_2.11/2.1.0/spark-sql_2.11-2.1.0.jar
或者通过Maven配置:
* Spark 2.1.0版本需要Java 7或以上,本文使用Java 1.8.0_72版本
2. SparkSession
创建一个基本的SparkSession,只要使用SparkSession.builder(),它是使用所有Spark SQL功能的入口点:
* 必须调用master(String master)方法指定主节点URL,本例使用local[*],表示本机多线程,线程数与服务器核数相同,具体请参考以下链接:
http://spark.apache.org/docs/latest/submitting-applications.html#master-urls
* 如果没有指定主节点URL的话,运行时会遇到以下错误:
Spark 2.0版本开始,SparkSession内置支持Hive的特性,包括使用HiveQL进行写查询,访问Hive的UDFs和从Hive表读取数据,不需要部署一个Hive的环境。
3. 创建DataFrames
使用SparkSession可以通过一个RDD、Hive表或者Spark数据源创建DataFrames,例如以下代码通过读取一个JSON文件创建一个DataFrame,然后调用show()方法显示内容:
4. 非类型化数据集操作(DataFrame操作)
DataFrames提供了Scala、Java、Python和R语言对结构化数据的操作。以下是一些使用Datasets对结构化数据进行处理的基本例子:
5. 以编程方式运行SQL查询
SparkSession的sql方法能够以编程方式运行SQL查询并返回Dataset<Row>。
例如以下例子:
6. 全局临时视图
Spark SQL的临时视图是当前session有效的,也就是视图会与创建该视图的session终止而失效。如果需要一个跨session而且一直有效的直到Spark应用终止才失效的临时视图,可以使用全局临时视图。全局临时视图是与系统保留数据库global_temp绑定,所以使用的时候必须使用该名字去引用,例如,SELECT * FROM global_temp.view1。
7. 创建Datasets
Datasets类似于RDDs,然而,Datasets使用了一个专门的编码器Encoder来序列化对象而不是使用Java的序列化或Kryo。这些专门的编码器使用的格式允许Spark执行像过滤filtering、排序sorting和哈希hashing等操作而不需要把对象反序列化成字节。
8. Datasets与RDDs的相互转换
Spark SQL支持2种不同的方法把RDDs转换为Datasets。第一种是使用反射获取RDD的Schema,当知道schema的时候,使用基于反射的方法会让代码更加简明而且效果也更好。第二种是通过编程接口指定schema,这种方法会使代码冗长,但是可以在运行时才知道数据列以及其类型的情况下事先构造Datasets。
8.1 使用反射获取Schema
Spark SQL支持将JavaBean的RDD自动转换成DataFrame。目前的Spark SQL版本不支持包含Map field(s)的JavaBeans,但嵌套的JavaBeans和List或者Array fields是支持的。可以通过创建一个实现Serializable接口和包含所有fields的getters和setters方法的类来创建一个JavaBean。
8.2 通过编程接口指定Schema
当JavaBean不能被事先定义的时候,通过编程创建Dataset<Row>需要三个步骤:
- 通过原来的RDD创建一个Rows格式的RDD
- 创建以StructType表现的schema,该StructType与步骤1创建的Rows结构RDD相匹配
- 通过SparkSession的createDataFrame方法对Rows格式的RDD指定schema
* 参考Spark SQL官方链接:http://spark.apache.org/docs/latest/sql-programming-guide.html#getting-started
TO BE CONTINUED...O(∩_∩)O