sparkSQL入门

一、概述

Spark SQL 是 Spark 用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame 并且作为分布式 SQL 查询引擎的作用。
为什么要学习 Spark SQL?我们已经学习了 Hive,它是将 Hive SQL 转换成MapReduce 然后提交到集群上执行,大大简化了编写 MapReduce 的程序的复杂性,由于 MapReduce 这种计算模型执行效率比较慢。所以 Spark SQL 的应运而生,它是将 SparkSQL 转换成 RDD,然后提交到集群执行,执行效率非常快!同时 Spark SQL 也支持从Hive 中读取数据。
Spark SQL 的特点:
在这里插入图片描述
在这里插入图片描述

二、Datasets 和 DataFrames

DataFrame

DataFrame 是组织成命名列的数据集。它在概念上等同于关系数据库中的表,但在底层具有更丰富的优化。DataFrames 可以从各种来源构建,
例如:

结构化数据文件
 hive 中的表
外部数据库或现有 RDDs
DataFrame API 支持的语言有 Scala,Java,Python 和 R。
在这里插入图片描述

使用 SparkSession

什么是 SparkSession
Apache Spark 2.0 引入了 SparkSession,其为用户提供了一个统一的切入点来使用 Spark 的各项功能,并且允许用户通过它调用 DataFrame 和 Dataset 相关 API来编写 Spark 程序。最重要的是,它减少了用户需要了解的一些概念,使得我们可以很容易地与 Spark 交互。在 2.0 版本之前,与 Spark 交互之前必须先创建 SparkConf 和 SparkContext。然而在 Spark 2.0 中,我们可以通过 SparkSession 来实现同样的功能,而不需要显式地创建 SparkConf, SparkContext 以及 SQLContext,因为这些对象已经封装在SparkSession 中。

非标准读取csv

package com.ccj.pxj.zq


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

object EMPDemo {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("pxj").setMaster("local[4]")
    val spark= SparkSession.builder().config(conf).getOrCreate()
    val data: Dataset[String] = spark.read.textFile("data/emp.csv")
    import  spark.implicits._
    val frame: DataFrame = data.map(x => {
      val datas: Array[String] = x.split(",")
      val empno = datas(0).toInt
      val ename = datas(1)
      val job = datas(2)
      val mgr = datas(3)
      val hiredate = datas(4)
      val sal = datas(5).toInt
      val comm = datas(6)
      val deptno = datas(7).toInt
      Emp(empno, ename, job, mgr, hiredate: String, sal, comm, deptno)
    }).toDF()
    frame.show()
    spark.stop()

  }

}
case class Emp(empno:Int,ename:String,job:String,mgr:String,hiredate:String,sal:Int,comm:String,deptno:Int)

读取Oracle

package com.ccj.pxj.zq

import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}

object ReadJDBCSparkSQLYouhua {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("pxj").setMaster("local[4]")
    val session = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
    val frame: DataFrame = session.read.format("jdbc")
      .option("url", "jdbc:oracle:thin:@192.168.25.50:1521/orcl")
      .option("dbtable", "emp")
      .option("user", "scott")
      .option("password", "lenovo")
      .load()
    frame.registerTempTable("sc")//优化一:注册成表
    val k=session.sql("select * from sc")
    //缓存起来
    session.sqlContext.cacheTable("sc")
    val k1=session.sql("select * from sc")
    k.show()
    println("----------------------------------------------------")
    k1.show()
  }

}

读取MySQL

package com.ccj.pxj.zq

import java.util.Properties

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object ReadJDBCSparkMysql {
  def main(args: Array[String]): Unit = {
    val pxj = new SparkConf().setMaster("local[4]").setAppName("pxj")
    val session = SparkSession.builder().config(pxj).enableHiveSupport().getOrCreate()
    val frame = session.read.format("jdbc")
      .option("url", "jdbc:mysql://localhost:3306/mrtest?characterEncoding=UTF-8")
      .option("dbtable", "dept")
      .option("user", "root")
      .option("password", "")
      .load()
    frame.show()
    println("-----------------------------------------------------------------------------------------------------")
    val properties = new Properties()
    properties.setProperty("user","root")
    properties.setProperty("password","")
    val frame1 = session.read.jdbc("jdbc:mysql://localhost:3306/mrtest?characterEncoding=UTF-8","dept",properties)
    frame1.show()
    session.stop()

  }

}

读取json与DF和DS互转

package com.ccj.pxj.zq

import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}

object DataSetsonJson {
  def main(args: Array[String]): Unit = {
    val pxj = new SparkConf().setMaster("local[4]").setAppName("pxj")

    val session = SparkSession.builder().enableHiveSupport().config(pxj).getOrCreate()
    val sc = session.sparkContext
    import  session.implicits._
    val frame: DataFrame = session.read.json(sc.parallelize("""{"gender": "Male", "name": "Tom"}""" :: Nil))
    frame.as[Person].show()//将DataFrame 转成DataSet
    println("************************************************")
    val persons: Array[Person] = frame.as[Person].collect()


  }
}
case class Person(name: String, gender: String)

DS例子

package com.ccj.pxj.zq

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession


object DataSetDemo {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("pxj").setMaster("local[4]")
    val session = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
    import  session.implicits._
    val dS = Seq(MyData("1","pxj"),MyData("2","wfy")).toDS
    dS.show()

  }

}
case  class MyData(a:String,b:String)

作者:pxj(潘陈)
日期:2020-02-05 凌晨1:01:30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值