浅谈Spark(二)

Spark SQL
结构化数据
一般指数据有固定的Schema(约束)
例如在用户表中,name字段是String型,那么每一条数据的name字段值都可以当作String类型来使用。

半结构化数据
一般指的是数据没有固定的Schema,但是数据本身是有结构的。
没有固定的Schema
指的是半结构化数据是没有固定的Schema的,可以理解为没有显示指定Schema,比如说一个用户信息的JSON文件,
第一条数据的phone_num有可能是数子,
第二条数据的phone_num虽说应该也是数子,但是如果指定为String,也是可以的,因为没有指定schema,没有显示的强制制约
有结构
虽说半结构化数据是没有显示指定schema的,也没有约束,但是半结构化数据本身是有隐式的结构的,也就是数据自身可以描述自身
例如JSON文件,其中的某一条数据是有字段这个概念的。每个字段也有类型的概念,所以说JSON是可以描述自身的,也就是数据本身携带有元信息

spark主要处理什么样的数据
RDD主要用于处理非结构化的数据,半结构化数据,结构化数据
sparkSQL主要用于处理结构化数据(较为规范的半结构化数据也可以处理)

SparkSQL官方介绍
1易整合
2统一的数据访问
3兼容hive
4标准的数据连接

Spark SQL数据抽象
DataFrame
schema元信息(可以理解为数据库的列名和类型)
DataFrame是一种以RDD为基础的分布式数据集,类似 于传统数据库的二维表格,带有Schema元信息(可以理解为数据库的列名和类型)
总结:DateFrame就是一个分布式的表
DataFrame=RDD-泛型+SQL的操作+优化
DataSet
DataSet包含了DataFrame表示为了DataSet[Row],即DataSet的子集。
DataFrame就是DataSet[Row]
RDD,DataFrame,DataSet的区别
RDD[person]
以person为参数类型,但不了解其内部结构。
DataFrame
提供了详细的结构信息schema列的名称和类型。这看起来就像一张表了
DataSet[Person]
不光有schema信息,还有类型信息

在Spark2.0版本之前
SQLcontext是创建DataFrame和执行SQL的入口
HiveContext通过hive sql语句操作hive表数据,兼容hive操作,hiveContext兼容SQLContext.
在spark2.0之后
这些都统一于SparkSession,SparkSession封装了SqlContext及HiveContext
实现了SQLContext及HiveContext所有功能
通过SparkSession还可以获取到SparkContext

创建DataFrame
1在本地创建一个文件,有id,name,age三列,用空格分隔,
然后上传到hdfs上
vim /root/person.txt
1 zhangsan 20
2 lisi 29
3 wangwu 25
4 zhaoliu 30
5 tianqi 35
6 kobe 40
上传数据文件到hdfs上:
hadoop fs -put /root/person.txt /
2.在spark-shell 执行下面命令,读取数据,将每一行数据使用列分隔符分割
打开Spark-shell
/export/servers/spark/bin/spark-shell
创建RDD
val lineRDD= sc.textFile(“hdfs://node01:8020/person.txt”).map(_.split)
3.定义case class (相当于表的schema)(样例类)
case class Person(id:Int,name:String,age:Int)
4将RDD和case class关联
val personRDD = lineRDD.map(x=>Person(x(0).toInt,x(1),x(2).toInt))
5.将RDD转换成DataFrame
val personDF = personRDD.toDF
6.查看数据和schema
personDF.show
±–±-------±–+
| id| name|age|
±–±-------±–+
| 1|zhangsan| 20|
| 2| lisi| 29|
| 3| wangwu| 25|
| 4| zhaoliu| 30|
| 5| tianqi| 35|
| 6| kobe| 40|
±–±-------±–+
personDF.printSchema
7.注册表
personDF.creatOrReplaceTempView(“t_person”)
8.执行sql
spark.sql(select id,name,age from t_person where id > 3).show
9.也可以通过SparkSession构建DataFrame
val dataFrame = spark.read.text(“hdfs://node01:8020/person.txt”)
dataFrame.show
dataFrame.printSchema

读取parquet文件
Parquet是一种流行的列式存储格式,可以高效地存储具有嵌套字段的记录,还可以针对相同类型的列进行压缩。
Parquet是语言无关的,而且不与任何一种数据处理框架绑定在一起,适配多种语言和组件,能够与Parquet配合的组件有:
查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL
计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite
数据模型: Avro, Thrift, Protocol Buffers, POJO

创建DataSet
1.通过spark.createDateset创建Dataset
val fileRDD = sc.textFile(“hdfs://node01:8020/person.txt”)
val ds1 = spark.createDataSet(fileRDD)
ds1.show

2.通过RDD.toDS的方法生成DataSet
case class Person (name : String,age : Int)
val data = List(Person(“zhangsan”,20),Person(“lisi”,30))
val dataRDD = sc. makeRDD(data)
val ds2 = dataRDD.toDS
ds2.show

3.通过DataFrame.as[泛型]转化生成DataSet
case class Person(name:String, age:Long)
val jsonDF= spark.read.json(“file:///export/servers/spark/examples/src/main/resources/people.json”)
val jsonDS = jsonDF.as[Person] //DataSet[Person]
jsonDS.show

4.DataSet也可以注册成表进行查询
jsonDS.createOrReplaceTempView(“t_person”)
spark.sql(“select * from t_person”).show

两种查询风格[先了解]
读取文件并转换为DataFrame或DataSet
DSL风格
SQL风格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值