Spark-SQL的Java实践案例
史上最简单的spark教程
所有代码示例地址:https://github.com/Mydreamandreality/sparkResearch
(提前声明:文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章,写作不易,转载请注明)
(文章参考:Elasticsearch权威指南,Spark快速大数据分析文档,Elasticsearch官方文档,实际项目中的应用场景)
(帮到到您请点点关注,文章持续更新中!)
Git主页 https://github.com/Mydreamandreality
Spark-SQL
-
啥子是Spark-SQL?
-
这个就比较厉害了,这是一个用来操作结构化,半结构化数据的接口
-
那么什么叫结构化数据呢:
- 结构化数据指的是任何有结构信息的数据,
- 所谓的结构数据,就是每条记录共用的已知的字段集合
- 如果你的数据是这个样子,那么sparkSQL绝对是你的开发首选
- sparkSQL查询这些数据会更加的简单高效
-
其实更具体的来说,SparkSQL提供了三大功能
- 首先SparkSQL可以从各种结构化数据源,比如JSON,parquet,Hive等中读取数据
- 其次sparkSQL不仅支持在spark程序中使用SQL语句进行查询,也支持连接外部的工具连接进行查询
- 最后当我们在spark程序中使用sparkSQL时,sparkSQL支持SQL,与常规的Java代码高度整合,包括连接RDD,SQL表等,这样是不是开发就很简单了
-
为了实现这些功能,SparkSQL提供了一种特殊的RDD,叫做DataFrame
- 1.3.0以前的版本中,是SchemaRDD,1.3之后才改名为DataFrame,
- 至于新版和旧版的区别…这个我就涉及到我的知识盲区了,有兴趣的可以去官网了解一哈
- 与RDD不同,DataFrame每一行的类型固定为Row,只有通过解析才能获取各个字段的值
- DataFrame看起来和普通的RDD差不多,但是在内部DataFrame可以利用结构信息更加高效地存储数据
- 此外DataFrame还支持RDD上所没有的一些新操作
- 比如运行SQL查询,DataFrame可以从外部数据源创建,也可以从查询结果或普通RDD中创建
let’s go,废话不多说,直接在代码中解释
- 在java中我们首先需要引入sparkSQL的依赖如下
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.2.3</version>
</dependency>
- 初始化sparkContext
- SparkSession是spark2.0新引入的概念,封装了很多的东西,在末尾会简单的说明一下
- SparkSessionSpark 2.0中提供了对Hive功能的内置支持,包括使用HiveQL编写查询,访问HiveUDF以及从Hive表读取数据的功能,要使用这些功能,无需拥有现有的Hive设置,1.x版本中这些都是需要我们配置的
SparkSession sparkSession = SparkSession.builder().master("local")
.appName("Java Spark SQL")
.getOrCreate();
- 基本案例代码:
- 要在一张数据表上进行查询,需要调用SQLContext中的sql()方法.,
- 那么首先我们就要告诉sparkSQL我们要查询的数据是什么
- 使用sparksession可以从现有的RDD,HIVE表或者spark支持的数据源中创建DataFrame
//读取要查询的数据
Dataset<Row> dataset = sparkSession.read().json("URL");
//假定我文件中的数据为 {name:123;age:123}
dataset.show(); //展示所有的数据{name:123;age:123}
完整案例代码
SparkSession sparkSession = SparkSession.builder().master("local")
.appName("Java Spark SQL")
.getOrCreate();
Dataset<Row> dataset = sparkSession.read().json("URL");
//只返回name字段
dataset.select("name").show();
//返回两个字段,所有age的value+1
dataset.select(col("name"),col("age").plus(1)).show();
//选择age大于21岁的人
dataset.filter(col("age").gt(21)).show();
//分组聚合,group age
dataset.groupBy("age").count().show();
- 除了简单的列引用和表达式之外, DataFrame也有丰富的函数库, 包括 string 操作, date 算术, 常见的 math 操作以及更多
- 在我们刚才的操作中,读取数据或者查询都是返回的dataframe,而从内部机制来看,最起码在javaApi中,仅仅是多个Row的dataSet
- dataframe 仍还还是个RDD,所有我们可以使用已有的转化操作,知识dataframe提供了一些额外的功能支持
- 而且我们可以把dataframe注册为临时表,使用SQL进行查询
/*以编程的方式运行SQL查询*/
//注册临时表
dataset.createOrReplaceTempView("user");
Dataset<Row> users = sparkSession.sql("SELECT * FROM user");
users.show();
- sparkSQL简直屌爆了有木有
完整代码在git:地址 https://github.com/Mydreamandreality/sparkResearch
spark-SQL支持的数据类型和Java对应
- 我在这快列举一下java和sparksql的数据类型对应关系,方便后面学习
- Spark SQL 的所有数据类型都在 org.apache.spark.sql.types 的包中. 要访问或者创建一个数据类型, 请使用 org.apache.spark.sql.types.DataTypes 中提供的 factory 方法.
数据类型 | java中的值类型 | 创建数据类型的API |
---|---|---|
ByteType | byte or Byte | DataTypes.ByteType |
ShortType | short or Short | …ShortType |
IntegerType | int or Integer | 后续都暂时省略,都是DataTypes.数据类型 |
LongType | long or Long | |
FloatType | float or Float | |
DoubleType | double or Double | |
DecimalType | java.math.BigDecimal | |
StringType | String | |
BinaryType | byte[] | |
BooleanType | boolean or Boolean | |
TimestampType | java.sql.Timestamp | |
DateType | java.sql.Date | DataTypes.DateType |
ArrayType | java.util.List | DataTypes.createArrayType(elementType) |
MapType | java.util.Map | DataTypes.createMapType(key, value) |
写的手酸了,这也太多了吧…
这章的内容就先写到这里,暂时我们已经了解了spark-sql的基础用法.
后续的章节都以此为基础深入案例
有啥子问题留言交流哦