综合案例分析
现有数据集 department.json与employee.json,以部门名称和员工性别为粒度,试计算每个部门分性别平均年龄与平均薪资。 department.json如下:
{"id":1,"name":"Tech Department"}
{"id":2,"name":"Fina Department"}
{"id":3,"name":"HR Department"}
employee.json如下:
{"name":"zhangsan","age":26,"depId":1,"gender":"male","salary":20000}
{"name":"lisi","age":36,"depId":2,"gender":"female","salary":8500}
{"name":"wangwu","age":23,"depId":1,"gender":"male","salary":5000}
{"name":"zhaoliu","age":25,"depId":3,"gender":"male","salary":7000}
{"name":"marry","age":19,"depId":2,"gender":"female","salary":6600}
{"name":"Tom","age":36,"depId":1,"gender":"female","salary":5000}
{"name":"kitty","age":43,"depId":2,"gender":"female","salary":6000}
两份数据我们在演示的时候已经创建并上传至 hdfs 文件系统,用户在这里需要请自行创建。
执行命令:
root@foo2 cloudera]# cd /root/device-report/
[root@foo2 device-report]# ls
b.txt test.sql
[root@foo2 device-report]# vim department.json
[root@foo2 device-report]# vim employee.json
[root@foo2 device-report]# ls
b.txt department.json employee.json test.sql
[root@foo2 device-report]# chown hdfs:hdfs department.json
[root@foo2 device-report]# chown hdfs:hdfs employee.json
[root@foo2 device-report]# ls
b.txt department.json employee.json test.sql
[root@foo2 device-report]# ll
总用量 16
-rw-r--r-- 1 hdfs hdfs 22 8月 14 10:45 b.txt
-rw-r--r-- 1 hdfs hdfs 100 8月 17 16:50 department.json
-rw-r--r-- 1 hdfs hdfs 474 8月 17 16:53 employee.json [root@foo2 device-report]# su hdfs
[hdfs@foo2 device-report]$ clear
[hdfs@foo2 device-report]$ ls
b.txt test.sql
[hdfs@foo2 device-report]$ cd /var/lib/hadoop-h
hadoop-hdfs/ hadoop-httpfs/
[hdfs@foo2 device-report]$ cd /var/lib/hadoop-hdfs/device-report/
[hdfs@foo2 device-report]$ ls
b.txt department.json employee.json person.json test.sql
[hdfs@foo2 device-report]$ hadoop fs -put department.json /testdata
[hdfs@foo2 device-report]$ hadoop fs -put employee.json /testdata
[hdfs@foo2 device-report]$ hadoop fs -ls /testdata
Found 3 items
-rw-r--r-- 2 hdfs supergroup 100 2018-08-17 16:54 /testdata/department.json
-rw-r--r-- 2 hdfs supergroup 474 2018-08-17 16:55 /testdata/employee.json
-rw-r--r-- 2 hdfs supergroup 71 2018-08-17 16:39 /testdata/person.json
查看内容
[hdfs@foo2 device-report]$ hadoop fs -cat hdfs://192.168.0.106:8020/testdata/department.json
{"id":1,"name":"Tech Department"}
{"id":2,"name":"Fina Department"}
{"id":3,"name":"HR Department"}
[hdfs@foo2 device-report]$ hadoop fs -cat hdfs://192.168.0.106:8020/testdata/employee.json
{"name":"zhangsan","age":26,"depId":1,"gender":"male","salary":20000}
{"name":"lisi","age":36,"depId":2,"gender":"female","salary":8500}
{"name":"wangwu","age":23,"depId":1,"gender":"male","salary":5000}
{"name":"zhaoliu","age":25,"depId":3,"gender":"male","salary":7000}
{"name":"marry","age":19,"depId":2,"gender":"female","salary":6600}
{"name":"Tom","age":36,"depId":1,"gender":"female","salary":5000}
{"name":"kitty","age":43,"depId":2,"gender":"female","salary":6000}
-rw-r--r-- 1 hdfs hdfs 237 8月 14 16:49 test.sql
[root@foo2 device-report]# mv department.json /var/lib/hadoop-hdfs/device-report/
[root@foo2 device-report]# mv employee.json /var/lib/hadoop-hdfs/device-report/
scala> val emp = spark.read.json("hdfs://192.168.0.106:8020/testdata/employee.json")
emp: org.apache.spark.sql.DataFrame = [age: bigint, depId: bigint ... 3 more fields]
scala> val dep = spark.read.json("hdfs://192.168.0.106:8020/testdata/department.json")
dep: org.apache.spark.sql.DataFrame = [id: bigint, name: string]
变成视图:
scala> emp.createOrReplaceTempView("employee")
scala> dep.createOrReplaceTempView("department")
2). 用算子操作
# 注意:两个表的字段的连接条件,需要使用三个等号
emp.join(dep,$"id" === $"depId").groupBy(dep("name"),emp("gender")).agg(avg(emp("salary")),avg(emp("age"))).show()
结果:
+---------------+------+-----------------+------------------+
| name|gender| avg(salary)| avg(age)|
+---------------+------+-----------------+------------------+
|Tech Department| male| 12500.0| 24.5|
|Fina Department|female|7033.333333333333|32.666666666666664|
|Tech Department|female| 5000.0| 36.0|
| HR Department| male| 7000.0| 25.0|
+---------------+------+-----------------+------------------+
3). 用SQL操作
scala> spark.sql("select department.name,avg(employee.salary),avg(employee.age) from employee left join department on employee.depId=department.id group by department.name,employee.gender").show()
结果:
+-----------------+---------------------+----------------------+
| name| avg(salary)| avg(age)|
+-----------------+---------------------+----------------------+
|Tech Department | 12500.0| 24.5|
|Fina Department |7033.333333333333|32.666666666666664|
|Tech Department | 5000.0| 36.0|
| HR Department | 7000.0| 25.0|
+-----------------+---------------------+----------------------+
2、3结果都是一样一样的。
- Spark源码系列(九)Spark SQL初体验之解析过程详解
好久没更新博客了,之前学了一些R语言和机器学习的内容,做了一些笔记,之后也会放到博客上面来给大家共享.一个月前就打算更新Spark Sql的内容了,因为一些别的事情耽误了,今天就简单写点,Spark1 ...
- Spark1.0新特性-->Spark SQL
Spark1.0出来了,变化还是挺大的,文档比以前齐全了,RDD支持的操作比以前多了一些,Spark on yarn功能我居然跑通了.但是最最重要的就是多了一个Spark SQL的功能,它能对RDD进 ...
- Spark SQL概念学习系列之Spark SQL 优化策略(五)
查询优化是传统数据库中最为重要的一环,这项技术在传统数据库中已经很成熟.除了查询优化, Spark SQL 在存储上也进行了优化,从以下几点查看 Spark SQL 的一些优化策略. (1)内存列式存 ...
- Spark SQL 用户自定义函数UDF、用户自定义聚合函数UDAF 教程(Java踩坑教学版)
在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...
- 8.Spark SQL
Spark SQL 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性分布式数据集 ...
- Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets Guide | ApacheCN
Spark SQL, DataFrames and Datasets Guide Overview SQL Datasets and DataFrames 开始入门 起始点: SparkSession ...
- Spark sql ---JSON
介绍Spark SQL的JSON支持,这是我们在Databricks中开发的一个功能,可以在Spark中更容易查询和创建JSON数据.随着网络和移动应用程序的普及,JSON已经成为Web服务API以及 ...
- Spark官方1 ---------Spark SQL和DataFrame指南(1.5.0)
概述 Spark SQL是用于结构化数据处理的Spark模块.它提供了一个称为DataFrames的编程抽象,也可以作为分布式SQL查询引擎. Spark SQL也可用于从现有的Hive安装中读取数据 ...
- 深入研究Spark SQL的Catalyst优化器(原创翻译)
Spark SQL是Spark最新和技术最为复杂的组件之一.它支持SQL查询和新的DataFrame API.Spark SQL的核心是Catalyst优化器,它以一种新颖的方式利用高级编程语言特性( ...
随机推荐
- Linux下安装oracle的步骤和一些问题
今天在Linux64位系统安装oracle数据库,折腾了一天,终于搞定了,现在把安装步骤梳理下,防止以后忘记: (以下内容来自http://blog.163.com/junwu_lb/blog/ ...
- alpha冲刺(7/10)
前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 会议照片 会议内容 陈晓彬(组长) 今日进展: 召开会议 撰写博客 项目初步整合前端代码 问题困扰: 大家可能因为某些问题会联系卡在某个点很久,需 ...
- Unity在WPF中的应用
1. 本文的实现类继承于IRepository using System; using System.Linq; using System.Linq.Expressions; using Zhang. ...
- java post json sample
import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class Te ...
- java多线程同步器
Java中多线程开发时,离不开线程的分工协作,常用的多线程的同步器有如下几种: 1.CountDownLatch 应用场景:等待一组线程任务完成后在继续执行当前线程. 用法:定义一个CountDown ...
- Zuul权限检验
一.达到的目标 /order/create 只能买家访问 /order/finish 只能卖家访问 /product/list 都能访问 二.创建User工程 1.创建user工程 选择的依赖 2.创 ...
- shell 生成MAC地址
# cat /dev/urandom |od -x |awk '{print $2,$3,$4}' |head -n 1 |sed -e 's/[[:space:]]//g' -e 's/\(..\) ...
- Python历史与安装
1.Python发展历史 起源 Python的作者,Guido von Rossum,荷兰人.1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加 ...
- VS Code 运行 TypeScript 操作指南
总结一下TypeScript开发环境用到的各种工具: Node——通过npm安装TypeScript及大量依赖包.从https://nodejs.org/下载并安装它:如果安装各种包不方便,可以将安装 ...
- 转的,具体 https://www.cnblogs.com/icyJ/p/FreeShare.html
网络资源下载网址 屏幕录像.图像处理,汉化和破解版本很新.国内破解汉化:大眼仔旭 http://www.dayanzai.me/ 开发工具,系统,数据库 http://msdn.itellyou.cn ...