简介
Spark SQL重要的是操作DataFrame,DataFrame本身提供了Save和Load的操作,
Load:可以创建DataFrame。
Save:把DataFrame中的数据保存到文件或者说用具体的格式来指明我们要读取的文件类型,以及用具体的格式来指出我们要输出的文件是什么类型。
Spark SQL执行基本操作时,内部结构流程图如下:
DataFrame本质是数据 + 数据的描述信息(结构元信息)。
所有的上述SQL及DataFrame操作最终都通过Catalyst翻译成Spark程序RDD操作代码。
Spark SQL前身是Shark,大量依赖Hive项目的jar包与功能,但在上面的扩展越来越难,因此出现了Spark SQL,它重写了分析器,执行器脱离了对Hive项目的大部分依赖,基本可以独立去运行,只用到Hive项目的两个地方:
(1)借用了Hive词汇分析的jar即HiveQL解析器
(2)借用了Hive的metastore和数据访问API即Hive Catalog
也就是说上图的左半部分的操作,全部用的是SparkSQL本身自带的内置SQL解析器解析SQL进行翻译,用到内置元数据信息(比如结构化文件中自带的结构元信息,RDD的schema中的结构元信息)右半部分则是走的Hive的HQL解析器,还有Hive元数据信息。因此左右两边的API调用的底层类会有不同。
SQLContext使用:
1.简单的解析器(Scala语言写的SQL解析器)比如:
(1)在半结构化的文件里面使用SQL查询时,是用这个解析器解析的。
(2)访问(半)结构化文件的时候,通过sqlContext使用schema,类生成DataFrame,然后DataFrame注册为表时,registerTempTable(注册临时表)然后从这个表里面进行查询时,即使用的简单的解析器。
simpleCatalog此对象中存放关系(表),比如我们指定的schema信息,类的信息,都是关系信息。
2.HiveContext使用:
(1)HiveQL解析器支持Hive的HQL语法,如只有通过HiveContext生成的DataFrame才能调用saveAsTable操作。
(2)hiveCatalog(存放数据库和表的元数据信息)
操作
读取HDFS中/myspark6的goods_visit.json文件。
val df=sqlContext.read.json("hdfs://localhost:9000/myspark6/goods_visit.json")
6.查看goods_visit.json中的所有数据。
df.show()
7.查看goods_visit.json的表结构。
df.printSchema()
8.只查看商品ID(goods_id)。
df.select("goods_id").show()
9.统计文件行数。
df.count
10.条件查询,查询点击次数超过500商品。(show是返回字段和表数据,collect是返回集合)
df.filter(df("click_num")>500).show
11.统计点击次数的最值、总和及平均数。
df.agg(max("click_num"),sum("click_num"),min("click_num"),avg("click_num")).show
12.过滤点击次数小于200的商品。
df.filter(df("click_num") < 200).show()
13.按点击次数进行分组统计。
df.groupBy("click_num").count().show()
14.读取goods_visit.json文件,保存为parquet格式。
val df = sqlContext.read.format("json").load("hdfs://localhost:9000/myspark6/goods_visit.json")
df.select("goods_id", "click_num").write.format("parquet").save("goods_visit.parquet")
15.查看保存的goods_visit.parquet文件。
hadoop fs -ls /user/zhangyu