SparkSQL学习案例:使用DataFrame和Dataset操作json数据

Posted Liu_Yin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SparkSQL学习案例:使用DataFrame和Dataset操作json数据相关的知识,希望对你有一定的参考价值。

一、测试数据集(奥特曼.json)

 

 

二、源代码及代码分析

 

 1  Scala版本
 2 
 3 import org.apache.spark.sql.SparkSession
 4 
 5 //根据分析数据写出相应的样例类
 6 case class Ultraman(name: String, age: BigInt, address: Array[String])
 7 
 8 object DatasetAndDataFrameExample {
 9 
10   def main(args: Array[String]): Unit = {
11 
12     //实例化SparkSession
13     val spark = SparkSession
14       .builder()
15       .master("local[*]")
16       .appName("DatasetAndDataFrameExample")
17       .getOrCreate()
18 
19     //为避免影响查看输出结果,设置日志打印等级为"WARN"
20     spark.sparkContext.setLogLevel("WARN")
21 
22     import spark.implicits._
23     //使用SparkSession读取输入路径的json数据文件
24     val df1 = spark.read.json("/home/liuyin/IdeaProjects/Spark/src/main/scala/chap07_SparkSQL/奥特曼.json")
25     //打印当前表格内容
26     df1.show()
27     //筛选出符合条件的数据并打印出来
28     df1.filter($"address" === Array("M78")).filter($"age" > 10000).show()
29 
30     val ds1 = spark.read.json("/home/liuyin/IdeaProjects/Spark/src/main/scala/chap07_SparkSQL/奥特曼.json").as[Ultraman]
31     ds1.show()
32     ds1.filter(_.name == "迪迦").show()
33 
34     spark.stop()
35   }
36 }

 

 

相关的细节

 

 (1)28行的$"address" === Array("M78")是SQLContext中的判断表达式,"==="是Column类中的一个方法,这个表达式也可以写成$"address".===(Array("M78"))

 

(2)使用"==="等表达式需要导入SOark隐式转换包,如22行所示

(3)第6行中的样例类是为了创建Dataset实例后,Dataset能识别出输入文件的每行数据各个元素的类型,样例类的属性名称应与输入数据的字段名一样

(4)第30行中,在调用.as[Ultraman]之前生成的还是一个DataFrame实例,调用之后会生成Dataset实例(其中的元素类型就是我们之前写的样例类Ultraman),as方法具体描述如下图

(5)样例类Ultraman在编译后会自动继承Product特质(类似于Java的接口),成为Product的子类,这么做的原因是as方法中的Ultraman类型必须是Encoder类型或其子类型,正巧隐式转换还有一个作用是将Dataset中的Product数据类型转换成Encoder类型的对象(调用了特质LowPrioritySQLImplicits里面的newProductEncoder方法),若样例类Ultraman在编译后不是Product类或子类则无法满足类型匹配

 可以看出Ultraman在编译后已经继承了Product

 as方法的详细描述

 newProductEncoder方法的源代码

三、输出结果

以上是关于SparkSQL学习案例:使用DataFrame和Dataset操作json数据的主要内容,如果未能解决你的问题,请参考以下文章

大数据学习笔记:SparkSQL入门

大数据学习笔记:SparkSQL入门

Spark学习之路 (十八)SparkSQL简单使用[转]

spark中使用sparksql对日志进行分析(属于小案例)

DataFrame DataSet Spark SQL学习

Note_Spark_Day07:Spark SQL(DataFrame是什么和数据分析(案例讲解))