Spark Sql

RDD,DataFrame,DataSet 三者联系

首先在spark2.0版本中,已经移除了DataFrame,成为了DataSet的一个约定例如 DataFrame=DataSet【ROW】
三者的区别:
RDD 就像 一个类名调用一样,就像people类,user类,可以清楚每个元素的元素类型 ,不清楚元素内部的具体属性信息
DataFrame 每个元素都是ROW类型,可以清楚元素内部的属性信息,但是不清楚每个属性是属于什么类型,例如String,Int类型,在需要泛型的时候有用。
DataSet类型,继承了RDD与DataFrame的优点,既可以知道属性名称,又可以知道具体的属性信息

简单几个例子

比较基础,做入门使用


//例子1,spark读取JSON文件生成DataFrame与DataSet,并作常规处理

import org.apache.spark.sql.SparkSession

object hello {
  case class User(name: String, age: BigInt, sex: String, addr: Array[String])
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .master("local[*]")
      .appName("Json_test")
      .getOrCreate()

    import spark.implicits._
    //生成DataFrame集合,读取并打印所有用户数据,统计拥有多少位用户。然后找到所有女性用户中,年龄小于25岁的用户。
    val df1 = spark.read.json("D:\\data\\user.json")
    df1.show
    df1.count
    df1.filter($"sex" === "female").filter($"age" >= 25).show
    //生成Dataset集合
    val ds1 = spark.read.json("D:\\data\\user01.json").as[User]
//    ds1.show
    ds1.filter(_.sex == "female").filter(_.age < 25).show
    spark.stop()
  }
}

JSON文件

[{"name":"Alice","age":18,"sex":"female","addr":["address_1","address_2","address_3"]},{"name":"Thomas","age":20,"sex":"male","addr":["address_1"]},{"name":"Tom","age":50,"sex":"female","addr":["address_1","address_3"]},{"name":"Catalina","age":30,"sex":"female","addr":["address_1","address_2"]}]

Pom文件

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>

例子二:spark读取JSON数据并由SQL方式处理

import org.apache.spark.sql.SparkSession

object hello {
  case class User(name: String, age: BigInt, sex: String, addr: Array[String])
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .master("local[*]")
      .appName("Json_test")
      .getOrCreate()


    //使用类似sql的语法,需首先将Dataframe创建为临时试图,和spaeksession绑定,不同的sparksession之间无法访问
    //全局临时试图 createGlobalTempView("") 或者 createOrReplaceGlobalTempView("t_user")
    val df1 = spark.read.json("D:\\data\\user.json")
   //临时试图在不同的
    df1.createTempView("t_user")

    spark.sql("select * from t_user").show()
    spark.sql("select sex,MAX(age),count(name) from t_user group by sex ").show()
  }
}
//样例三,从mysql中读取DataFrame,并对DataFrame做处理后写入一张新表里面
import org.apache.spark.sql.SparkSession

/**
 * @Author: 唐
 * @Date: 2020/3/18 21:49
 */
object DB {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .master("local[2]")
      .appName("sparkSQL")
      .getOrCreate()
    Class.forName("com.mysql.jdbc.Driver").newInstance()
    val options = Map("url" -> "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true",
      "driver" -> "com.mysql.jdbc.Driver",
      "user" -> "root",
      "password" -> "623558",
      "dbtable" -> "user")
    val df6 = spark.read.format("jdbc").options(options).load()
    df6.createTempView("t_newtable")
    var df7= spark.sql("select count(id) from t_newtable")
    val properties=new java.util.Properties()
    properties.setProperty("user","root")
    properties.setProperty("password","623558")

    import org.apache.spark.sql.SaveMode
    //保存为Mysql文件
    df7.write.mode(SaveMode.Overwrite).jdbc("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true","New_table",properties)
//    //保存为parquest文件( 从分区目的是将数据保存为一个文件)
    df7.repartition(1).write.format("parquet").save("D:\\data\\parquet")
//    //保存为json
    df7.repartition(1).write.json("D:\\data\\JSON")
//    //保存为CSV文件
//    df7.repartition(1).write.csv("D:\\data\\CSV")

    df6.show
  }
}
/*
数据写入有四种模式
1.SavaMode.OverWrite:腹写模式,将原先创建的表删除,重新创建并写入
2.SavaMode.Append : 追加模式,如果表不存在,则创建表并写入数据,如果表存在,则追加进原表
3.SaveMode.Ignore : 如果表不存在,则创建表并写入数据,如果表存在,则忽略当前操作,不报存当前数据
4.SaveMode.ErrorIfExists:如果表存在,则直接抛出异常
*/

windows本地运行需将hadoop.dll 放入 c:\windows\system32目录中

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值