spark的三种弹性数据集,在使用过程中,本人对它们的转化进行了归纳,一下是以此数据集合为基础进行的
注意
rdd 《 dataframe 《 dataset
因为dataset是在后面出现的,因此两者互相转化上,rdd难以转成dataframe或者dataset ,但反过来则相反
白山涵月楼酒店 https://hotel.qunar.com/cn/baishan/dt-3266/ 距市中心直线1.5公里 · 市政府 279 47 2021年-04月-13日 14时:50分:36秒 出行专享免费取消钟点房商务出行 1 52 白山 929
V5连锁酒店(白山轴承店) https://hotel.qunar.com/cn/baishan/dt-2590/ 距市中心直线1.3公里 · 白山市火车站/山货庄 98 46 2021年-04月-13日 14时:50分:37秒 免费取消棋牌麻将浪漫情侣商务出行 2 8 白山 476
如家商旅酒店(白山民中街店) https://hotel.qunar.com/cn/baishan/dt-2345/ 距市中心直线1.8公里 · 市政府 164 47 2021年-04月-13日 14时:50分:37秒 免费取消钟点房亲子家庭商务出行 3 25 白山 362
星程酒店(白山市政府店) https://hotel.qunar.com/cn/baishan/dt-3274/ 距市中心直线1.2公里 · 市政府 159 45 2021年-04月-13日 14时:50分:37秒 免费取消钟点房商务出行商务出行 4 16 白山 229
V5连锁酒店(白山三江店) https://hotel.qunar.com/cn/baishan/dt-2589/ 距市中心直线584米 · 市政府 90 44 2021年-04月-13日 14时:50分:37秒 免费取消钟点房亲子家庭商务出行 5 9 白山 0
白山圣佳快捷宾馆 https://hotel.qunar.com/cn/baishan/dt-3559/ 距市中心直线1.6公里 · 市政府 75 45 2021年-04月-13日 14时:50分:38秒 天天特惠免费取消浪漫情侣商务出行 6 43 白山 208
如家酒店(白山火车客车总站店) https://hotel.qunar.com/cn/baishan/dt-3183/ 距市中心直线2.2公里 · 白山市火车站/山货庄 114 45 2021年-04月-13日 14时:50分:38秒 天天特惠免费取消钟点房亲子家庭 7 28 白山 298
汉庭酒店(白山火车站店) https://hotel.qunar.com/cn/baishan/dt-5173/ 距市中心直线1.9公里 · 白山市火车站/山货庄 152 47 2021年-04月-13日 14时:50分:38秒 免费取消钟点房亲子家庭亲子精选 8 14 白山 233
一 dataframe的使用
def main(args: Array[String]): Unit = {
val sparkconf = new SparkConf().setMaster("local[*]").setAppName("wordcount")
val spark= SparkSession.builder()
.appName("Spark Sql basic example")
.config(sparkconf)
.getOrCreate()
//添加此行代码提供隐式转化
import spark.implicits._
//读取文件 读取文件的数据集就是 dataframe 注意 文件夹下读取的文件类型必须一致
val df = spark.read.textFile("data")
val gh = df.map(
x=>{
val datas =x.split("\t")
val money = datas(3).toInt
val name = datas(0)
val count= datas(10).toInt
val goal = datas(4).toInt
(name, goal,money,count)
})
gh.show(10)
//转换列名 需要隐式转换
val gk = gh.toDF("name","goal","money","count")
//创建对应的临时表 存在替换
gk.createOrReplaceTempView("hotel")
//spark跨会话 建立全局表
gk.createGlobalTempView("t1")
gk.sqlContext.sql("select * from hotel ").show()
gk.sqlContext.sql("select * from global_temp.t1 ").show()
//spark的dsl语法
gk.select($"money"+1 ).show()
//过滤操作
gk.filter("money>100").show()
//将字符串封装为一个column
gk.select($"name",$"money",$"count").show()
//scala集合转df
val gm = (1 to 1000).toDF("num")
gm.show()
//rdd转df 但结果集为row gk.schema可以打印数据类型
val rdd1 = gk.rdd
rdd1.collect()
println(gk.schema)
}
rdd转dataframe比较繁琐主要两种方式,一种使用toDF的方式,一种使用api的方式
//rdd转化为dataframe方法一
val gw = rdd1.map(x=>{
//获取数据类型
(x.getString(0),x.getInt(1),x.getInt(2),x.getdef main(args: Array[String]): Unit = {
val sparkconf = new SparkConf().setMaster("local[*]").setAppName("wordcounts")
val spark= SparkSession.builder()
.appName("Spark Sql basic example2")
.config(sparkconf)
.getOrCreate()
//rdd转df api方式
val sc = spark.sparkContext
val rdd2 = sc.parallelize(List(("lisa",18),("lisa",1),("lisa",1),("lisa",1),("lisa",1),("lisa",1)),2).map{
//丢失数据类型
case (name, age) => Row(name,age)
}
val schmea = StructType(Array(StructField("name",StringType),StructField("age",IntegerType)))
val df = spark.createDataFrame(rdd2,schmea)
df.show
spark.close()
}Int(3))
}).toDF("name","goal","money","count")
gw.show(10)
使用api方式
package sparksql.demo01.sparksql复习
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
object Rdd_to_DataFrame {
def main(args: Array[String]): Unit = {
val sparkconf = new SparkConf().setMaster("local[*]").setAppName("wordcounts")
val spark= SparkSession.builder()
.appName("Spark Sql basic example2")
.config(sparkconf)
.getOrCreate()
//rdd转df api方式
val sc = spark.sparkContext
val rdd2 = sc.parallelize(List(("lisa",18),("lisa",1),("lisa",1),("lisa",1),("lisa",1),("lisa",1)),2).map{
//丢失数据类型
case (name, age) => Row(name,age)
}
val schmea = StructType(Array(StructField("name",StringType),StructField("age",IntegerType)))
val df = spark.createDataFrame(rdd2,schmea)
df.show
spark.close()
}
}
dataframe转datase互相转化
json数据如下
{"name": "延边", "max": 2212, "min": 5, "count": 522, "avg": 136}
{"name": "唐山", "max": 1070, "min": 20, "count": 1794, "avg": 141}
package sparksql.demo01.sparksql复习
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
object DF_to_DS {
def main(args: Array[String]): Unit = {
val sparkconf = new SparkConf().setMaster("local[*]").setAppName("wordcount")
val spark= SparkSession.builder()
.appName("Spark Sql basic example")
.config(sparkconf)
.getOrCreate()
//添加此行代码提供隐式转化
import spark.implicits._
//读取文件
val df:DataFrame = spark.read.json("json")
//df转化为ds
val ds = df.as[cityinfo]
ds.show()
//dataset转dataframe
val df1 = df.toDF()
df1.collect().foreach(println)
}
}
case class cityinfo(name:String,max:BigInt,min:BigInt,count:BigInt,avg:BigInt)
dataset的使用方式
package sparksql.demo01.sparksql复习
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
object DataSetTest {
def main(args: Array[String]): Unit = {
val sparkconf = new SparkConf().setMaster("local[*]").setAppName("wordcount")
val spark= SparkSession.builder()
.appName("Spark Sql basic example")
.config(sparkconf)
.getOrCreate()
//添加此行代码提供隐式转化
import spark.implicits._
val list = List(User("zhansan",4),User("lisi",33))
val dataset1 = list.toDS()
dataset1.show()
dataset1.createOrReplaceTempView("person")
spark.sql("select *from person where age<33")
spark.close()
}
}
case class User(username:String, age:Long)