Spark(九) -- SparkSQL API编程
本文测试的Spark版本是1.3.1
Text文本文件测试
一个简单的person.txt文件内容为:
JChubby,13
Looky,14
LL,15
分别是Name和Age
在Idea中新建Object,原始代码如下:
object TextFile{
def main(args:Array[String]){
}
}
SparkSQL编程模型:
第一步:
需要一个SQLContext对象,该对象是SparkSQL操作的入口
而构建一个SQLContext对象需要一个SparkContext
第二步:
构建好入口对象之后,要引入隐式转换的方法,作用是将读取到的各种文件转换成DataFrame,DataFrame是SparkSQL上进行统一操作的数据类型
第三步:
根据数据的格式,构建一个样例类。作用是提供将读取到的各种各样的数据类型隐式转换成一个统一的数据格式,方便编程
第四步:
使用SQLContext对象读取文件,并将其转换成DataFrame
第五步:
对数据进行相关操作。
1.DataFrame自带的操作方式。DataFrame提供了很多操作数据的方法,如where,select等
2.DSL方式。DSL其实使用的也是DataFrame提供的方法,但是在操作属性时可以方便的使用’ + 属性名的方式进行操作
3.将数据注册成表,通过SQL语句操作
object TextFile{
def main(args:Array[String]){
//第一步
//构建SparkContext对象,主要要使用new调用构造方法,否则就变成使用样例类的Apply方法了
val sc = new SparkContext()
//构建SQLContext对象
val sqlContext = new SQLContext(sc)
//第二步
import sqlContext.implicits._
//第三步
case Person(name:String,age:Int)
//第四步,textFile从指定路径读取文件如果是集群模式要写hdfs文件地址;通过两个map操作将读取到的文件转换成Person类的对象,每一行对应一个Person对象;toDF将其转换成DataFrame
val people = sc.textFile("文件路径").map(_.split(",")).map{case (name,age) => Person(name,age.toInt)}.toDF()
//第五步
//DataFrame方法
println("------------------------DataFrame------------------------------------")
//赛选出age>10的记录,然后只选择name属性,show方法将其输出
people.where(people("age") > 10).select(people("name")).show()
//DSL
println("---------------------------DSL---------------------------------")
people.where('age > 10).select('name).show()
//SQL
println("-----------------------------SQL-------------------------------")
//将people注册成people表
people.registerTempTable("people")
//使用sqlContext的sql方法来写SQL语句
//查询返回的是RDD,所以对其进行collect操作,之后循环打印
sqlContext.sql("select name from people where age > 10").collect.foreach(println)
//保存为parquet文件,之后的parquet演示会用到
people.saveAsParquet("保存的路径")
}
}
parquet格式文件测试:
val sc = new SparkContext()
val sql = new SQLContext(sc)
import sql.implicits._
val parquet = sql.parquetFile(args(0))
println("------------------------DataFrame------------------------------------")
println(parquet.where(parquet("age") > 10).select(parquet("name")).show())
println("---------------------------DSL---------------------------------")
println(parquet.where('age > 10).select('name).show())
println("-----------------------------SQL-------------------------------")
parquet.registerTempTable("parquet")
sql.sql("select name from parquet where age > 10").map(p => "name:" + p(0)).collect().foreach(println)
Json格式测试:
val sc = new SparkContext()
val sql = new SQLContext(sc)
import sql.implicits._
val json = sql.jsonFile(args(0))
println("------------------------DataFrame------------------------------------")
println(json.where(json("age") > 10).select(json("name")).show())
println("---------------------------DSL---------------------------------")
println(json.where('age > 10).select('name).show())
println("-----------------------------SQL-------------------------------")
json.registerTempTable("json")
sql.sql("select name from json where age > 10").map(p => "name:" + p(0)).collect().foreach(println)
可以看到上面的代码几乎和读取文本文件的一模一样,只不顾sc在读取文件的时候使用了parquetFile/jsonFile方法,而之后的操作是一摸一样的
由于parquet和json数据读取进来就是一个可操作的格式并且会自动转换成DataFrame,所以省去了case class的定义步骤和toDF的操作
以上为SparkSQL API的简单使用
Spark(九) -- SparkSQL API编程的更多相关文章
- 利用SparkLauncher 类以JAVA API 编程的方式提交Spark job
一.环境说明和使用软件的版本说明: hadoop-version:hadoop-2.9.0.tar.gz spark-version:spark-2.2.0-bin-hadoop2.7.tgz jav ...
- 03、IDEA下Spark API编程
03.IDEA下Spark API编程 3.1 编程实现Word Count 3.1.1 创建Scala模块 3.1.2 添加maven支持,并引入spark依赖 <?xml version=& ...
- Spark学习之RDD编程(2)
Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...
- DirectX API 编程起步 #01 项目设置
=========================================================== 目录: DirectX API 编程起步 #02 窗口的诞生 DirectX A ...
- Team Foundation API - 编程访问 WorkItem
Team Foundation Server (TFS)工具的亮点之一是管理日常工作项, 工作项如Bug, Task,Task Case等. 使用TFS API编程访问TFS服务器中的工作项, 步骤如 ...
- Hive On Spark和SparkSQL
SparkSQL和Hive On Spark都是在Spark上实现SQL的解决方案.Spark早先有Shark项目用来实现SQL层,不过后来推翻重做了,就变成了SparkSQL.这是Spark官方Da ...
- Flink Program Guide (2) -- 综述 (DataStream API编程指导 -- For Java)
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- The MySQL C API 编程实例
在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...
- Mysql C语言API编程入门讲解
原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程. ...
随机推荐
- container_of分析--可用good【转】
转自:http://blog.csdn.net/tigerjibo/article/details/8299589 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.container_of宏 ...
- c#使用selenium截图,操作dom元素
using System; //添加selenium的引用 using OpenQA.Selenium.PhantomJS; using OpenQA.Selenium.Chrome; using O ...
- Smith-Waterman算法及其Java实现
Smith-Waterman算法是1981年Smith和Waterman提出的一种用来寻找并比较具有局部相似性区域的动态规划算法,很多后来的算法都是在该算法的基础上发展的.这是一种两序列局部比对算法, ...
- QPS、TPS、PV等网站业务关键字释义
QPS:Query Per Second TPS:Transaction Per Second PV:Page View RT:Response Time UV:Unique Visitor DAU: ...
- Android 登录界面调用输入法时让界面自动上移,使输入法不会遮挡到主界面(Activity)
先贴上效果图: <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:andr ...
- springBoot 发布war包
1.packaging 改为war <packaging>war</packaging> 2.剔除内置tomcat <dependency> <groupId ...
- ThreadLocal深度解析
本文基于jdk1.8.0_66写成 0. ThreadLocal简介 ThreadLocal可以提供线程内的局部对象,合理的使用可以避免线程冲突的问题比方说SimpleDateFormat是线程不安全 ...
- IP自动切换脚本
@echo off & cls & color 47 & mode con cols=80 lines=25 & title [IP自动切换工具]clsecho. ec ...
- php 单文件上传
php 单文件上传 通过 PHP,可以把文件上传到服务器. 创建一个文件上传表单 允许用户从表单上传文件是非常有用的. 请看下面这个供上传文件的 HTML 表单: Filename: 请留意如下有关此 ...
- shell脚本学习(二)
shell传递参数 shell脚本在执行是可以传递参数,脚本内获取参数的格式为:$n,n为一个数字,1为第一个参数,2为第二个参数,以此类推 其中,$0代表了要执行的文件名 实例: 代码如下: #!/ ...