详细解读Spark的数据分析引擎:Spark SQL
一、spark SQL:类似于Hive,是一种数据分析引擎
什么是spark SQL?
spark SQL只能处理结构化数据
底层依赖RDD,把sql语句转换成一个个RDD,运行在不同的worker上
特点:
1、容易集成:SQL语句
2、对不同的数据源提供统一的访问方式:DataFrame 用DataFrame屏蔽数据源的差别
3、兼容Hive
大纲:
核心概念:DataFrame(看作表):就是表,是Spark SQL对结构化数据的抽象集合
表现形式:RDD
表=表结构+数据
DataFrame=schema+RDD
DataSet(新API接口 看作表)
如何创建DataFrame?
1、方式一:通过case class创建DataFrame
创建表结构
case class EMP(empno:Int,ename:String,job:String,mgr:String,hiredata:String,sal:Int,comm:String,deptno:Int)
导入emp.csv文件并指定分隔符
val lines = sc.textFile("/root/temp/emp.csv").map(_.split(","))
lines.collect
将表结构和数据关联起来
val allEmp = lines.map(x=>Emp(x(0).toInt,x(1),x(2),x(3),x(4),x(5).toInt,x(6),x(7).toInt))
创建DataFrame:
val empDF = allEmp.toDF
操作DataFrame:
empDF.show:展示DataFrame
empDF.printSchema:打印DataFrame的表结构
2、方式二:通过SparkSession.createDataFrame()创建DataFrame
什么是spark session?
从spark2.0以后提供了统一访问spark各个模块的对象:spark session
创建表结构:用StructType类
import org.apache.spark.sql
import org.apache.spark.sql.types._
val myschema = StructType(List(empno:Int,ename:String,job:String,mgr:String,hiredata:String,sal:Int,comm:String,deptno:Int))
导入emp.csv文件并指定分隔符
val lines = sc.textFile("/root/temp/emp.csv").map(_.split(","))
将表结构和数据关联起来,把读入的数据emp.csv映射成一行,这里没有带表结构
import.org.apache.spark.sql._
val rowRDD = lines.map(x=>Row(x(0).toInt,x(1),x(2),x(3),x(4),x(5).toInt,x(6),x(7).toInt))
通过SparkSession.createDataFrame()创建表
val df = spark.createDataFrame(rowRDD,myschema)
3、方式三:直接读取一个具有格式的数据文件作为DataFrame(json文件)
val peopleDF = spark.read.json("/root/training/")
4、操作DataFrame:DSL语句和SQL语句
DSL语句:empDF.show
empDF.printSchema
查询所有员工的信息:df.show
查询所有员工的姓名:df.select("ename").show
或者df.select($"ename").show
查询员工信息:姓名 薪水 薪水+100
df.select($"ename",$"sal",$"sal"+100).show
查询工资大于2000的员工
df.filter("sal">2000).show
分组:
df.groupBy("deptno").count.show
SQL语句:需要将DataFrame注册成一张临时视图
df.createOrReplaceTempView("emp")
spark.sql("select * from emp").show
spark.sql("select * from emp where deptno=10").show
5、临时视图:2种
1、只在当前会话中有效:临时视图 df.createOrReplaceTempView("emp")
2、在全局范围内都有效:全局临时视图 df.createGlobalTempView("empG")
例:在当前会话中
spark.sql("select * from emp").show
spark.sql("select * from global_temp.empG").show
例:在新的会话中
spark.newSession.sal("select * from emp").show
spark.newSession.sal("select * from global_temp.empG").show
二、使用数据源:
1、load函数加载数据源和save函数保存数据源
load函数默认的数据源是parquet文件
json函数默认的数据源是json文件
val usersDF = spark.read.load("/root/training/spakr-2.1.0-bin-hadoop2.7/examples/")
usersDF.select("name","favorite_color").show
usersDF.select("name","favorite_color").write.save("/root/temp/result")
2、Parquet文件:是sparkSQL load函数默认加载的数据源,按列存储的文件
如何把其他文件格式转换成parquet文件?
例:json文件---->parquet文件
val empJSON = spark.read.json("/root/temp/emp.json") #直接读取一个具有格式的数据文件作为DataFrame
empJSON.write.parquet("/root/temp/empparquet") #/empparquet目录不能事先存在
或者empJSON.wirte.mode("overwrite").parquet("/root/temp/result") #/result目录可以事先存在
功能:支持Schema的合并
第一个文件:val df1 = sc.makeRDD(1 to 5).map(i=>(i,i*2)).toDF("single","double")
df1.write.parquet("/root/temp/test_table/key=1")
第二个文件:val df2 = sc.makeRD(6 to 10).map(i=>(i,i*3)).toDF("single","triple")
df2.write.parquet("/root/temp/test_table/key=2")
合并两个文件:val df3 = spark.read.option("mergeSchema","true").parquet("/root/temp/test_table")
3、json文件:
spark.read.json("/root/training/spark-2.1.0-bin-hadoop-2.7/examples/src/main/resources/people.json")
spark.read.format("json").load("/root/training/spark-2.1.0-bin-hadoop2.7/examples/src/main/resources/people.json")
4、RDBMS:需要把RDBMS的驱动加入到spark shell中
spark.read.format("jdbc").option("url","jdbc:oracle:thin:@192.168.182.11:1521/orcl.example.com").option("dbtable","scott.emp").option("user","scott").option("password","tiger").load
或使用Properties类
import java.util.Properties
val prop = new Properties()
prop.setProperty("user","scott")
prop.setProperty("password","tiger")
val oracleDF1 = spark.read.jdbc("jdbc:oracle:thin:@192.168.182.11:1521/orcl")
作者:李金泽AllenLi,清华大学硕士研究生,研究方向:大数据和人工智能
详细解读Spark的数据分析引擎:Spark SQL的更多相关文章
- Spark入门,概述,部署,以及学习(Spark是一种快速、通用、可扩展的大数据分析引擎)
1:Spark的官方网址:http://spark.apache.org/ Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL.Spark Streaming.Graph ...
- 详细解读大数据分析引擎Pig&PigLatin语句
Pig 一.Pig的介绍: Pig由Yahoo开发,主要应用于数据分析,Twitter公司大量使用Pig处理海量数据,Pig之所以是数据分析引擎,是因为Pig相当于一个翻译器,将PigLatin语句翻 ...
- 大规模数据分析统一引擎Spark最新版本3.3.0入门实战
@ 目录 概述 定义 Hadoop与Spark的关系与区别 特点与关键特性 组件 集群概述 集群术语 部署 概述 环境准备 Local模式 Standalone部署 Standalone模式 配置历史 ...
- Apache Spark大数据分析入门(一)
摘要:Apache Spark的出现让普通人也具备了大数据及实时数据分析能力.鉴于此,本文通过动手实战操作演示带领大家快速地入门学习Spark.本文是Apache Spark入门系列教程(共四部分)的 ...
- 使用Spark加载数据到SQL Server列存储表
原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...
- Cassandra联手Spark 大数据分析将迎来哪些改变?
2014Spark峰会在美国旧金山举行,与会数据库平台供应商DataStax宣布,与Spark供应商Databricks合作,在它的旗舰产 品 DataStax Enterprise 4.5 (DSE ...
- 大数据系列之并行计算引擎Spark介绍
相关博文:大数据系列之并行计算引擎Spark部署及应用 Spark: Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎. Spark是UC Berkeley AMP lab ( ...
- 大数据学习:Spark是什么,如何用Spark进行数据分析
给大家分享一下Spark是什么?如何用Spark进行数据分析,对大数据感兴趣的小伙伴就随着小编一起来了解一下吧. 大数据在线学习 什么是Apache Spark? Apache Spark是一 ...
- Python3实战Spark大数据分析及调度 (网盘分享)
Python3实战Spark大数据分析及调度 搜索QQ号直接加群获取其它学习资料:715301384 部分课程截图: 链接:https://pan.baidu.com/s/12VDmdhN4hr7yp ...
随机推荐
- 解决The type 'ASP.global_asax' exists in both ASP.global_asax同时存在问题
习惯发布站点的同学有时候可能遇见以下错误 这是发布时[预编译勾选/不勾选]产生的文件冲突导致的 如果不勾选预编译会发布以下代码 如果勾选预编译会发布以下代码 错误就在于此,如果非预编译Global.a ...
- Android JNI的使用方法
1.JNI是什么 JNI是Java Native Interface的缩写,它提供若干的API实现Java与其他语言之间的通信.而Android Framework由基于Java语言的的Java层与基 ...
- mac下/usr/local/bin No such file or directory问题解决
在对composer进行全局配置时,执行 sudo mv composer.phar /usr/local/bin/composer 时,mac报错:/usr/local/bin No such fi ...
- JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架)
JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架) 本来想实现 QQ 登录,有域名一直没用过,还得备案,好麻烦,只能过几天再更新啦. 先把实现的发送邮箱验证码更能更新了. 老规矩,更多内容在注释 ...
- RN在Android打包发布App
参考资料:http://www.jianshu.com/p/b8811669bcb6 RN在Android打包发布App 1-:生成一个签名密钥你可以用keytool命令生成一个私有密钥.在Windo ...
- ChatOps如何变革企业业务
[编者按]本文作者为日志分析软件公司 Logz.io 的联合创始人 Tomer Levy,主要介绍 ChatOps 的特点与发展历程,以及将来可能带来的业务变革.文章系国内 ITOM 管理平台 One ...
- 【python】字典/dictionary操作
字典(dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号:分割,每个键值对之间用逗号,分割,整个字典包括在花括号 {} 中 ...
- LeetCode题解之Max Consecutive Ones
1.题目描述 2.问题分析 遍历一次数组,以每个1 为起点向后数,数到0 时比较当前1的个数和最大1 的个数,然后将遍历的起点放到当前0 的后面. 3.代码 int findMaxConsecutiv ...
- Django开发笔记(一)
Django开发笔记(一) 标签(空格分隔): Django Python 1. 创建并运行Django项目 创建开发环境 安装Django pip install django==version 执 ...
- Oracle EBS 自治事务
自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...