SparkSQL(Spark-1.4.0)实战系列(三)——SparkSQL应用案例

本节主要内容

  1. 数据准备
  2. 案例实战

数据准备

将实验数据Date.txt、Stock.txt、StockDetail.txt(hadoop fs -put /data /data)上传到HDFS上,如下图所示

Date.txt格式如下:

//Date.txt文件定义了日期的分类,将每天分别赋予所属的月份、星期、季度等属性
//日期,年月,年,月,日,周几,第几周,季度,旬、半月
2014-12-24,201412,2014,12,24,3,52,4,36,24

Stock.txt格式如下:

//Stock.txt文件定义了订单表头
//订单号,交易位置,交易日期
ZYSL00014630,ZY,2009-5-7

StockDetail.txt格式如下:

//订单号,行号,货品,数量,价格,金额
HMJSL00006421,9,QY524266010101,1,80,80

案例实战-查询所有订单中每年的销售单数、销售总额:

//定义case class用于后期创建DataFrame schema
//对应Date.txt
case class DateInfo(dateID:String,theyearmonth :String,theyear:String,themonth:String,thedate :String,theweek:String,theweeks:String,thequot :String,thetenday:String,thehalfmonth:String)
//对应Stock.txt
case class StockInfo(ordernumber:String,locationid :String,dateID:String)
//对应StockDetail.txt
case class StockDetailInfo(ordernumber:String,rownum :Int,itemid:String,qty:Int,price:Double,amount:Double) 

//加载数据并转换成DataFrame
val DateInfoDF = sc.textFile("/data/Date.txt").map(_.split(",")).map(d => DateInfo(d(0), d(1),d(2),d(3),d(4),d(5),d(6),d(7),d(8),d(9))).toDF()
//加载数据并转换成DataFrame
val StockInfoDF= sc.textFile("/data/Stock.txt").map(_.split(",")).map(s => StockInfo(s(0), s(1),s(2))).toDF()
//加载数据并转换成DataFrame
val StockDetailInfoDF = sc.textFile("/data/StockDetail.txt").map(_.split(",")).map(s => StockDetailInfo(s(0), s(1).trim.toInt,s(2),s(3).trim.toInt,s(4).trim.toDouble,s(5).trim.toDouble)).toDF()

//注册成表
DateInfoDF.registerTempTable("tblDate")
StockInfoDF.registerTempTable("tblStock")
StockDetailInfoDF.registerTempTable("tblStockDetail")

//执行SQL
//所有订单中每年的销售单数、销售总额
//三个表连接后以count(distinct a.ordernumber)计销售单数,sum(b.amount)计销售总额
sqlContext.sql("select c.theyear,count(distinct a.ordernumber),sum(b.amount) from tblStock a join tblStockDetail b on a.ordernumber=b.ordernumber join tblDate c on a.dateid=c.dateid group by c.theyear order by c.theyear").collect().foreach(println)

//执行过程

//执行结果

案例实战-求所有订单每年最大金额订单的销售额:

sqlContext.sql("select c.theyear,max(d.sumofamount) from tblDate c join (select a.dateid,a.ordernumber,sum(b.amount) as sumofamount from tblStock a join tblStockDetail b on a.ordernumber=b.ordernumber group by a.dateid,a.ordernumber ) d  on c.dateid=d.dateid group by c.theyear sort by c.theyear").collect().foreach(println)

//执行过程

//执行结果

“`

透过上述代码可以感受到SparkSQL的强大,其它更为复杂的查询可以参考mmicky_wyy的博客:http://blog.csdn.net/book_mmicky/article/details/39177041

添加公众微信号,可以了解更多最新Spark、Scala相关技术资讯

时间: 2024-09-15 14:40:54

SparkSQL(Spark-1.4.0)实战系列(三)——SparkSQL应用案例的相关文章

SparkSQL(Spark-1.4.0)实战系列(一)——DataFrames基础

主要内容 本教程中所有例子跑在Spark-1.4.0集群上 DataFrames简介 DataFrame基本操作实战 DataFrames简介 本文部分内容译自https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html DataFrames在Spark-1.3.0中引入,主要解决使用Spark RDD API使用的门槛,使熟悉R语言等的数据分析师能

SparkSQL(Spark-1.4.0)实战系列(二)——DataFrames进阶

本节主要内容如下 DataFrame与RDD的互操作实战 不同数据源构建DataFrame实战 DataFrame与RDD的互操作实战 1 采用反映机制进行Schema类型推导(RDD到DataFrame的转换) SparkSQL支持RDD到DataFrame的自动转换,实现方法是通过Case类定义表的Schema,Spark会通过反射机制读取case class的参数名并将其配置成表的列名. //导入该语句后,RDD将会被隐式转换成DataFrame import sqlContext.imp

【转】WF4.0实战系列索引

WF4.0实战系列索引       从WF4.0 betal1出来的时候就开始使用WF4.0,由于资料不多,学习过程也非常艰苦.今年四月份的时候打算写WF4.0实战系列,由于今年是本命年故坚持写了24篇文章.这个系列的文章都有一个特点,就是每篇文章都有一个实例,所以对初学者来说是很有帮助的.这个系列的绝大数文章和程序都是原创,少数是翻译和借鉴别人的.写一个文章索引,方便WF4的学习者查看.     WF4.0实战(一):文件审批流程     WF4.0实战(二):超市收银软件     WF4.0

xen虚拟化实战系列(三)之xen虚拟机复制

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1284621 xen虚拟化实战系列文章列表 xen虚拟化实战系列(一)之xen虚拟化环境安装xen虚拟化实战系列(二)之xen虚拟机安装xen虚拟化实战系列(三)之xen虚拟机复制xen虚拟化实战系列(四)之xen虚拟机扩展磁盘空间一法xen虚拟化实战系列(五)之xen虚拟机扩展磁盘空间再一法xen虚拟化实战系列(六)之x

BootStrap智能表单实战系列(三)分块表单配置详解_javascript技巧

什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstrap 是由 Twitter 的 Mark Otto 和 Jacob Thornton 开发的.Bootstrap 是 2011 年八月在 GitHub 上发布的开源产品. Bootstrap 包的内容 基本结构:Bootstrap 提供了一个带有网格系统.链接样式.背景的基本结构.这将在 Bootst

WF4.0实战(三):WCF服务

这篇文章,通过一个简单的WCF交互,讲解一下WF4.0中一组重要活动:Messaging,它包括:Receive.ReceiveAndSendReply.Send. SendAndReceiveReply.这里将详细讲解ReceiveAndSendReply和SendAndReceiveReply两个活动的配置以及使用,以及它与普通的WCF的区别 . 如果你了解WCF,你一定知道WCF可以缩略为ABC.A :Address (服务在哪里?),B: Binding (怎么才能访问服务?),C: C

memcached实战系列(三)memcached命令使用

memcached命令的使用,在这里我们最好了解一下命令的含义,对命令有一个大致的了解,在了解的基础上进行使用.这里的命名是常用的crud命令的演示. 1.1.1. memcached命令的格式 标准协议:Memcached所有的标准协议包含在对item执行命令过程中,一个item包含两行: 第一行:Key Flags ExpirationTime Bytes Key:Key 用于查找缓存值 Flags:一个32位的标志值,客户机使用它存储关于键值对的额外信息(譬如用户规定1 json 2 xm

xen虚拟化实战系列(三)xen虚拟机复制

1. 查看现有一个虚拟机的配置文件 1)虚拟机配置文件的位置/etc/xen/test01 2) 虚拟机配置文件 # cat /etc/xen/test01 2. 复制xen虚拟机磁盘文件 # cp  /data/test01.img  /data/test02.img 3. 复制与修改新虚拟机配置文件 # cd /etc/xen/   # cp test01 test02 # vi test02 # 修改说明: (1) name修改为新虚拟机名称 (2) uuid把最后几个数据改变一下 (3)

基于.NET平台网络编程入门实战系列 三

服务器是干啥子用滴?监听客户端,响应客户端用滴! 虽然是世界上最简陋的服务器,但是也有几个注意点: 1.因为要一个死循环监听客户端响应,也就是说无法和用户进行交互了,所以防止前台假死就要为监听新起一个线程: 2.要把新起的线程td.IsBackground = true;设置为后台线程,这样的话线程才会随着应用程序的关闭而关闭,不然的话关了窗体,它还在运行: 3.跨线程问题,在新的线程里改变UI会报跨线程改变UI的错误,所以要用Invoke; 4.在监听的死循环中加入 Thread.Sleep(