spark SQL 笔记

4 篇文章 0 订阅
3 篇文章 0 订阅

spark SQL 笔记(2.4.0版本)

  • spark 的创建
    spark 所有的功能切入点都在 sparkSession 。所有开始我们应该导入类并创建sparkSession 类。
import org.apache.spark.sql.SparkSession
val spark = SparkSession
  .builder()
  .appName("Spark SQL basic example")
  .config("spark.some.config.option", "some-value")
  .getOrCreate()
  • 读写数据方法

在2.0版本以后,SparkSession 为Hive 提供了内置的支持,无需在在配置 Hive。SparkSession 可以从现有的 RDD,Hive,和 spark 数据源来创建 DataFrame。
将 RDD 转化为DataFrame 只需要调用toDF方法。

case class Person (name:String, age:Int)
import spark.implicits._
val a = sc.parallelize(List(1,23,3,4))
a.toDF.show()
val b = sc.parallelize(List(Person("Ning", 18), Person("wxh", 22)))
b.toDF.show()

注意这里导入的spark是我们之前创建的 SparkSession 变量的名字。并且要导入成功的话 spark 必须是 val 类型的。我们也可以自定义类型 (Person) 然后转化为 RDD 再转化为 DF。

val dfJson = spark.read.json("<路径>") //读取json文件
val dfJons1 = spark.read.format("json").load(<路径>) //format用来指定读取的格式
//读取csv文件,option用来指定参数,header 是否指定头部,sep 指定分割符, inferScheam 是否自动推断类型
val csv = spark.read.format("csv").option("header",true).option("sep",",").option("inferSchema","true").load("<路径>")

执行写入操作,可以将 DF 储存成 json, csv, orc, parquet 等格式。
在读取数据的时候也可以用.as[<类>]来指定类型。

csv.write.format("<格式>").save(<路径>)
  • 通过 jdbc 连接数据库(以 mysql 为例)
    spark SQL 可以通过 jdbc 从其他数据库中读取数据,其返回值时 DataFrame
    启动 spark-shell 时指定 jdbc 驱动 jar 包路径:
spark-shell --driver-class-path mysql-connector-java-5.1.47.jar --jars mysql-connector-java-5.1.47.jar
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().getOrCreate()
import spark.implicits._
val jdbcMysql = spark.read.format("jdbc").option("url", "jdbc:mysql://127.0.0.1:3306/test").option("dbtable","dfWrod").option("user","root").option("password","123")
jdbcMysql.select("id").show()

其中:

url要连接的JDBC URL,可以在URL中指定特定于源的连接属性。
dbtable指定要读入的数据表,不能和 query 同时指定
password指定数据库密码
user指定数据库用户名
fetchsize确定每次jdbc每次往返要读取的行数,只能用于读
batchsizejdbc批处理大小,每次往返要插入的行数,只能用于写
driver用于连接到此URL的JDBC驱动程序的类名
  • 数据操作(以刚才读入的csv为例)
csv.printSchema() // 查看数据的结构
csv.select("id", "word“).show() // 查询 id 和 word 列
csv.select($"id"+1).show() // id列的所有值都加一并输出
csv.filter($"id" > 23).show() // 过滤id列 大于23 的数据
csv.groupBy($"pos").count().show() // 对pos列进行分组求和。

关于对DataFrame的各种操作,可查看API
将DataFrame注册为SQL临时视图,使用SQL语句来进行进行查询

csv.createOrReplaceTempView("<临时表名>") 
spark.sql("select * from <临时表名>").show() //会生成 metastore_db 文件

临时视图是会话范围的,当会话结束时,视图就会被删除,要创建一个全局的临时会话,让所有的会话都能访问,直到spark应用结束,可用:

csv.createGlobalTempView("<表名>")
spark.sql("select * from global_temp.<表名>")
spark.newSession().sql("select * from global_temp.<表名>").show() // 跨会话

全局临时视图与系统保留的数据库 global_temp 绑定。

  • DataFrame 的创建
  1. 将现有的 RDD 通过 toDF 转化为 DataFrame。
  2. 通过反射推断来创建。通过 case 类定义表的模式,使用反射读取case类的参数名称,并成为列的名称
case class people(name:String,age:Int)
import spark.implicits._
val peo = List(("Ning",18),("wxh",20))
val rdd  = sc.paralize(peo).map(attr => people(attr(0),attr(1))),toDF
  1. 以编程方式指定 schema:
    从原始的 RDD 中创建 rows RDD。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值