Spark-SQL的Java实践案例

史上最简单的spark教程
所有代码示例地址:https://github/Mydreamandreality/sparkResearch

(提前声明:文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章,写作不易,转载请注明)
(文章参考:Elasticsearch权威指南,Spark快速大数据分析文档,Elasticsearch官方文档,实际项目中的应用场景)
(帮到到您请点点关注,文章持续更新中!)
Git主页 https://github/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/Mydreamandreality/sparkResearch


spark-SQL支持的数据类型和Java对应

  • 我在这快列举一下java和sparksql的数据类型对应关系,方便后面学习
  • Spark SQL 的所有数据类型都在 org.apache.spark.sql.types 的包中. 要访问或者创建一个数据类型, 请使用 org.apache.spark.sql.types.DataTypes 中提供的 factory 方法.
数据类型java中的值类型创建数据类型的API
ByteTypebyte or ByteDataTypes.ByteType
ShortTypeshort or Short…ShortType
IntegerTypeint or Integer后续都暂时省略,都是DataTypes.数据类型
LongTypelong or Long
FloatTypefloat or Float
DoubleTypedouble or Double
DecimalTypejava.math.BigDecimal
StringTypeString
BinaryTypebyte[]
BooleanTypeboolean or Boolean
TimestampTypejava.sql.Timestamp
DateTypejava.sql.DateDataTypes.DateType
ArrayTypejava.util.ListDataTypes.createArrayType(elementType)
MapTypejava.util.MapDataTypes.createMapType(key, value)

写的手酸了,这也太多了吧…

这章的内容就先写到这里,暂时我们已经了解了spark-sql的基础用法.

后续的章节都以此为基础深入案例

有啥子问题留言交流哦

更多推荐

史上最简单的spark教程第九章-SparkSQL编程Java案例实践(一)斗图王来辣