本文测试的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编程的更多相关文章

  1. 利用SparkLauncher 类以JAVA API 编程的方式提交Spark job

    一.环境说明和使用软件的版本说明: hadoop-version:hadoop-2.9.0.tar.gz spark-version:spark-2.2.0-bin-hadoop2.7.tgz jav ...

  2. 03、IDEA下Spark API编程

    03.IDEA下Spark API编程 3.1 编程实现Word Count 3.1.1 创建Scala模块 3.1.2 添加maven支持,并引入spark依赖 <?xml version=& ...

  3. Spark学习之RDD编程(2)

    Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...

  4. DirectX API 编程起步 #01 项目设置

    =========================================================== 目录: DirectX API 编程起步 #02 窗口的诞生 DirectX A ...

  5. Team Foundation API - 编程访问 WorkItem

    Team Foundation Server (TFS)工具的亮点之一是管理日常工作项, 工作项如Bug, Task,Task Case等. 使用TFS API编程访问TFS服务器中的工作项, 步骤如 ...

  6. Hive On Spark和SparkSQL

    SparkSQL和Hive On Spark都是在Spark上实现SQL的解决方案.Spark早先有Shark项目用来实现SQL层,不过后来推翻重做了,就变成了SparkSQL.这是Spark官方Da ...

  7. Flink Program Guide (2) -- 综述 (DataStream API编程指导 -- For Java)

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  8. The MySQL C API 编程实例

    在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...

  9. Mysql C语言API编程入门讲解

    原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程.   ...

随机推荐

  1. Kuangbin 带你飞 最小生成树题解

    整套题都没什么难度. POJ 1251 Jungle Roads #include <map> #include <set> #include <list> #in ...

  2. 【bzoj2242】计算器

    #include<bits/stdc++.h> #define inf 1000000000 using namespace std; typedef long long ll; ?a:g ...

  3. echarts 图表建立步骤

    需要引用的文件 <script src="web/mobile/js/jquery-1.8.3.min.js"></script> <script s ...

  4. Jxl、JxCell图表导出功能的实现

    最近接触过许多报表导出功能,也用过多种工具进行导出功能的实现,但对于图表的导出一直没有仔细的去展开研究和探讨,直到最近略微整理了下这方面的需求和技术攻克. 首先导出excel功能的实现主要有JXL.J ...

  5. snakes

    原地址 讨论区 Changing 算法一 我会随机! 由于我忘了设置多组数据,期望得分0至100. 算法二 我会模拟! 复杂度\(O(t^2)\),期望得分60. 但是很多人忘记题目给出的是环形-- ...

  6. JVM垃圾收集规则和算法

    1.垃圾收集 Garbage Collection 程序计数器.虚拟机栈.本地方法栈这三部分内存随着线程生而生,随着线程灭而自然的回收,他们的大小在编译期间就大致确定了下来,所以对这部分的回收是具备确 ...

  7. 提取windows用户明文密码

    前段时间mimikatz热传,主要是因为可以直接提取当前登录用户明文密码. 其实,有个更厉害的神器,无需那么多命令操作,一个命令搞定: C:\>wce -w WCE v1.3beta (Wind ...

  8. java异常基本知识

    Throwable     |--Error     |--Exception         |--RuntimeException                异常体系的特点:异常体系中的所有类 ...

  9. 学习PHPCMS需要掌握的函数

    路径:phpcms\libs\classes\model.class.php /** * 执行sql查询 * @param $where 查询条件[例`name`='$name'] * @param ...

  10. 使用es索引遇到的问题记录

    1设置es索引的运行内存: 直接在启动文件里面改就好,启动命令是elasticsearch.bat,用notepad++编辑这个文件,里面添加这样的一行:SET ES_HEAP_SIZE=10g即可 ...