spark-sql 1.x版本与2.x版本的wordcount实现

spark-sql的操作对象由dataframe变为了dataset

spark-sqlspark的一个组件,可以在spark程序中进行SQL查询。是一个分布式的sql查询引擎。

spark-sql1.3的版本中开始使用dataframe对象,来对数据进行操作。

dataframe=rdd+schema语法风格分为两种:SQL语法风格:dataframe对象注册虚拟表后查询,DSL语法风格dataframe对象直接使用方法

1.spark-sql 的1.x版本的wc

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * 
  * 使用spark-SQL的1.x版本实现wordcount
  */
object WCpre {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf()
    .setMaster("local")
    .setAppName(WCpre.getClass.getName)
//设置rdd 持久化到内存和磁盘的序列化方式|||worker之间类的传递的序列化方式
      .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
//可以放在任何位置,值的比较可以使用 = = = 3个等号筛选
    dataDF.select("*").groupBy("word").count().withColumnRenamed("count","cns").where($"cns" > 1).orderBy($"cns" desc).show()



  }
}
//样例类用来提供schema信息。
case class WC(word:String)

1.创建SparkContext

2.创建SQLContext

 3.创建RDD

 4.创建一个样例类,并定义类的成员变量

 5.整理数据并关联class

 6.RDD转换成DataFrame(导入隐式转换)

 7.DataFrame注册成临时表

 8.书写SQLTransformation

 9.执行Action

2.spark-sql 2.x 版本的wc

import org.apache.spark.SparkContext
import org.apache.spark.sql.{DataFrame, Dataset, SQLContext, SparkSession}


/**
  * 
  * spark2.x  统一了程序入口api
  */
object WCNow {

  def main(args: Array[String]): Unit = {

    val session: SparkSession = SparkSession.builder()
      .master("local")
      .appName(WCNow.getClass.getName)
      //如果该对象存在直接调用,不存在就创建
      .getOrCreate()

    import session.implicits._

    //可以得到之前的版本定义的sc,sqlContext对象,特点...
    val sqlContext: SQLContext = session.sqlContext
    val sc: SparkContext = session.sparkContext

    //读取文件,dataset默认存在schema信息为value
    val file: Dataset[String] = session.read.textFile("wc.txt")
    val words: Dataset[String] = file.flatMap(_.split(" "))
    //设置自定义schema
    val wDF: DataFrame = words.toDF("word")
    wDF.createTempView("t_wc")
    session.sql("select word,count(*) cns from t_wc group by word order by cns desc").show()


    wDF.select("word","cns").groupBy("word").count().withColumnRenamed("count","cns").where("cns > 1").orderBy($"cns" desc).show()

  }
}



3.DataSet结合了RDDDataFrame的优点(类型安全、面向对象、不受JVM限制、没有GC开销)




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值