spark的rdd,dataframe以及dataset的使用和转化方法

spark的三种弹性数据集,在使用过程中,本人对它们的转化进行了归纳,一下是以此数据集合为基础进行的
注意
rdd 《 dataframe 《 dataset
因为dataset是在后面出现的,因此两者互相转化上,rdd难以转成dataframe或者dataset ,但反过来则相反

白山涵月楼酒店	https://hotel.qunar.com/cn/baishan/dt-3266/	距市中心直线1.5公里 · 市政府	279	47	2021-04-1314:50:36秒	出行专享免费取消钟点房商务出行	1	52	白山	929
V5连锁酒店(白山轴承店)	https://hotel.qunar.com/cn/baishan/dt-2590/	距市中心直线1.3公里 · 白山市火车站/山货庄	98	46	2021-04-1314:50:37秒	免费取消棋牌麻将浪漫情侣商务出行	2	8	白山	476
如家商旅酒店(白山民中街店)	https://hotel.qunar.com/cn/baishan/dt-2345/	距市中心直线1.8公里 · 市政府	164	47	2021-04-1314:50:37秒	免费取消钟点房亲子家庭商务出行	3	25	白山	362
星程酒店(白山市政府店)	https://hotel.qunar.com/cn/baishan/dt-3274/	距市中心直线1.2公里 · 市政府	159	45	2021-04-1314:50:37秒	免费取消钟点房商务出行商务出行	4	16	白山	229
V5连锁酒店(白山三江店)	https://hotel.qunar.com/cn/baishan/dt-2589/	距市中心直线584米 · 市政府	90	44	2021-04-1314:50:37秒	免费取消钟点房亲子家庭商务出行	5	9	白山	0
白山圣佳快捷宾馆	https://hotel.qunar.com/cn/baishan/dt-3559/	距市中心直线1.6公里 · 市政府	75	45	2021-04-1314:50:38秒	天天特惠免费取消浪漫情侣商务出行	6	43	白山	208
如家酒店(白山火车客车总站店)	https://hotel.qunar.com/cn/baishan/dt-3183/	距市中心直线2.2公里 · 白山市火车站/山货庄	114	45	2021-04-1314:50:38秒	天天特惠免费取消钟点房亲子家庭	7	28	白山	298
汉庭酒店(白山火车站店)	https://hotel.qunar.com/cn/baishan/dt-5173/	距市中心直线1.9公里 · 白山市火车站/山货庄	152	47	2021-04-1314: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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值