Spark SQL概述

官网概述:
Spark SQL is Apache Spark’s module for working with structured data.
Spark SQL是Apache Spark处理结构化数据的模块。Spark SQL不仅仅有访问和操作SQL的功能,还提供了其他的非常丰富的操作:外部数据源,优化。

Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同,Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部,Spark SQL使用此额外信息来执行额外的优化。有几种与Spark SQL交互的方法,包括SQL和Dataset API。在计算结果时,使用相同的执行引擎,与您用于表达计算的API /语言无关。这种统一意味着开发人员可以轻松地在不同的API之间来回切换,从而提供表达给定转换的最自然的方式。

所有的在这个页使用的样本数据的示例中包括在所述火花分布,并且可以在运行spark-shell,pyspark壳,或sparkR外壳。

Spark SQL的前世今生:

在这里插入图片描述
spark sql官网介绍:
在这里插入图片描述
在这里插入图片描述

Spark SQL架构
在这里插入图片描述
SQLContext/HiveContext/SparkSession使用
1.Spark1.X中Spark SQL的入口点:SQLContext
在这里插入图片描述
json文件:

{"name":"zhangsan"}
{"name":"Lisi","age":20}
{"name":"wangwu","age":22}
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext

import org.apache.spark.SparkConf

/**
 * SQLContext的使用:
 */
object SQLContextApp {

  def main(args: Array[String]) {

    val path = args(0)

    //1)创建相应的Context
    val sparkConf = new SparkConf()

    //在测试或者生产中,AppName和Master我们是通过脚本进行指定
    //sparkConf.setAppName("SQLContextApp").setMaster("local[2]")

    val sc = new SparkContext(sparkConf)
    val sqlContext = new SQLContext(sc)

    //2)相关的处理: json
    val people = sqlContext.read.format("json").load(path)
    people.printSchema()
    people.show()

    //3)关闭资源
    sc.stop()
  }

}

提交spark Application到环境中运行

spark-submit --class cnn.spark.SQLContextApp --master local[2] /home/hadoop/lib/sql-1.0.jar /home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/example/src/main/resources/people.json

2.Spark1.X中Spark SQL的入口点:HiveContext

//sc is an existing SparkContext
val sqlContext =new org.apache.spark.sql.hive.HiveContext(sc)

HiveContext并不需要Hive环境:
1.to use a HiveContext,you do not need to have an existing Hive setup
2.有hive-site.xml

import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}

/**
 * HiveContext的使用
 * 使用时需要通过--jars 把mysql的驱动传递到classpath
 */
object HiveContextApp {

  def main(args: Array[String]) {
    //1)创建相应的Context
    val sparkConf = new SparkConf()

    //在测试或者生产中,AppName和Master我们是通过脚本进行指定
    //sparkConf.setAppName("HiveContextApp").setMaster("local[2]")

    val sc = new SparkContext(sparkConf)
    val hiveContext = new HiveContext(sc)

    //2)相关的处理:
    hiveContext.table("emp").show

    //3)关闭资源
    sc.stop()
  }

}

3.Spark2.X中Spark SQL的入口点:SparkSession
在这里插入图片描述

import org.apache.spark.sql.SparkSession

/**
 * SparkSession的使用
 */
object SparkSessionApp {

  def main(args: Array[String]) {

    val spark = SparkSession.builder().appName("SparkSessionApp")
      .master("local[2]").getOrCreate()

    val people = spark.read.json("file:///Users/rocky/data/people.json")
    people.show()

    spark.stop()
  }
}

thriftserver&beeline使用
1.启动thriftserver:

sbin/start-thriftserver.sh --master local[2] --jars ~/user/mysql-connector-java-5.1.27-bin.jar 

2.启动beeline

beeline -u jdbc:hive2://localhost:10000 -n hadoop

修改thriftserver启动占用的默认的端口号(10000是默认的端口号):

sbin/start-thriftserver.sh --master local[2] --jars ~/user/mysql-connector-java-5.1.27-bin.jar --hiveconf hive.server2.thrift.port=13000
beeline也是需要修改的:
beeline -u jdbc:hive2://localhost:13000 -n hadoop

thriftserver和普通的spark-shell/spark-sql有什么区别?
1.spark-shell,spark-sql都是一个spark applicqtion;
2.thriftserver不管启动多少个客户端(beeline/code),永远都是一个spark application,解决了一个数据共享的问题,多个客户端可以共享数据

#jdbc方式编程访问
maven添加依赖:org.spark-project.hive#hive-jdbc

<dependency>
   <groudID>org.spark-project.hive</groudID>
   <artifactID>hive-jdbc</artifaceID>
   <version>1.2.1.spark2</version>
  </dependency> 
import java.sql.DriverManager

/**
 *  通过JDBC的方式访问
 */
object SparkSQLThriftServerApp {

  def main(args: Array[String]) {

    Class.forName("org.apache.hive.jdbc.HiveDriver")

    val conn = DriverManager.getConnection("jdbc:hive2://hadoop01:13000","hadoop","")
    val pstmt = conn.prepareStatement("select empno, ename, sal from emp")
    val rs = pstmt.executeQuery()
    while (rs.next()) {
      println("empno:" + rs.getInt("empno") +
        " , ename:" + rs.getString("ename") +
        " , sal:" + rs.getDouble("sal"))

    }

    rs.close()
    pstmt.close()
    conn.close()


  }


}

在使用jdbc开发时,一定要先启动thriftserver!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值