简介
- spark core:弹性分布式数据库
- spark SQL:带有schema信息的RDD
- spark sql支持非结构化数据分析、半结构化数据分析、结构化数据分析
- spark sql将关系数据库的结构化数据管理能力与机器学习算法的数据处理能力融合
Dataframe
spark的数据抽象是RDD
spark SQL的数据抽象是DataFrame
与RDD相比,DataFrame会关注数据的结构
DataFrame的创建
构建RDD需要声明SparkContext对象,构建DataFrame则需要构建SparkSession对象
创建步骤:
- 导入包,创建环境对象SparkSession
import org.Apache.spark.sql.SparkSession val spark = SparkSession.builder().getOrCreate()
- 导入隐式转换的包:
import spark.implicits._
- 读取文件:
- 用spark.read()方法,调用.json(路径).csv(路径)\parquet(路径)
- (泡泡糖上没写)用load.format.json()/csv()/-加载
实例
DataFrame的保存
使用spark.write来保存:
df.write.json(“xx”)
df.write.parquet(“xxx”)
df.write.csv(“xxx”)
DataFrame的操作
选择
df.select(df(“属性名1”),df(“属性名2”).show()
筛选
df.filter(df(“”) > x).show()
分组聚合
df.groupBy(“xx”).count().show()
排序:
df.sort(df(“xx”).desc,df(“xxx”).esc).show()
desc为降序排列
重命名
Do.select(df.(“x1”).as(“x2)).show()
RDD转换为DataFrame
利用反射机制推断RDD模式
讲RDD转换成一个DataFrame:
-
创建一个类型
case class Person(name:String,age:Int)
-
读取一个RDD,划分,并封装为Person类型,通过**toDF()**函数,将RDD转换为DataFrame
val perpleDF = spark.sparkContext.textFile(“”) .map(_.split(” ”) .map(data => Person(data(0)),data(1).trim.toInt)) .toDF()
进行查询:先通过createOrRepleaceTempView注册临时表,再通过sql语句查询
df.createOrReplaceTempView(“tablename”)
spark.sql(“select xxx from tablename where xxx”)
使用编程方式定义RDD模式
- 导入包
import org.Apache.spark.sqltypes import org.Apache.spark.sql.Row
- 制作表头
val fields = Array(StructField(“name”,StringType,true),StructField(“age”,IntegerType,true)) val scheme = StructType(field)
- 制作表中的记录:将数据加载进来:
val peopleRDD = spark.sparkContext.textFile(“xxx”) val rowRDD = peopleRDD.map(_.split(‘ ’)).map(attributes => Row(attributes(0),attributes(1).trim.toInt))
- 把表头和表中的记录拼装在一起
val peopleDF = spark.createDataFrame(rowRDD,schema) peopleDF.createOrReplaceTempView(“people”) val results = spark.sql(“SELECT name,age from people”)