Spark学习五:spark sql

Spark学习五:spark sql

标签(空格分隔): Spark


一,概述:

001.PNG-100.9kB

002.PNG-25.9kB

001.PNG-139.3kB

二,Spark的发展历史

001.PNG-95.3kB

003.PNG-106.6kB

002.PNG-93kB

005.PNG-370.8kB

004.PNG-197kB

三,Spark sql和hive对比

001.PNG-158.8kB

002.PNG-139.7kB

003.PNG-109.7kB

四,spark sql 架构

004.PNG-90.6kB

五,sprk sql访问hive数据

001.PNG-315.7kB

002.PNG-14.4kB

hive-site.xml需要拷贝到spark的conf目录下面

启动方式一:

//启动应用
bin/spark-shell --driver-class-path jars/mysql-connector-java-5.1.27-bin.jar --master local[2]
sqlContext.sql("show databases").show()

002.PNG-14.4kB

sqlContext.sql("use default").show()

sqlContext.sql("show tables").show()

启动方式二:

//启动应用
bin/spark-sql --driver-class-path jars/mysql-connector-java-5.1.27-bin.jar --master local[2]
show databases;

002.PNG-78.8kB

//缓存
cache table emp;
//取消缓存
uncache table emp;

003.PNG-47.8kB

六,catalyst

001.PNG-542.5kB

002.PNG-61.1kB

003.PNG-74.3kB

七,thriftserver

启动服务

sbin/start-thriftserver.sh --master local[2] --driver-class-path jars/mysql-connector-java-5.1.27-bin.jar

启动beeline客户端

bin/beeline
beeline> !connect jdbc:hive2://localhost:10000

001.PNG-99kB

八,Dataframe

001.PNG-97.9kB

002.PNG-255.6kB

003.PNG-215kB

004.PNG-233.3kB

005.PNG-257.1kB

006.PNG-239.5kB

007.PNG-270.6kB

008.PNG-238.5kB

009.PNG-161.6kB

截图06.png-143.5kB

截图07.png-299.2kB

001.PNG-157.3kB

002.PNG-66.7kB

九,加载外部数据源

1,加载json数据

val json_df=sqlContext.jsonFile("hdfs://study.com.cn:8020/spark/people.json")

json_df.show()

2,加载hive数据

sqlContext.table("default").show()

3,加载parquet格式数据

val parquet_df=sqlContext.jsonFile("hdfs://study.com.cn:8020/spark/users.parquet")
parquet_df.show()

4,jdbc方式获取数据

val df = sqlContext.jdbc("jdbc:mysql://localhost:3306/db_0306?user=root&password=123456", "my_user")

val mysql_df = sqlContext.load("jdbc", Map("url" -> "jdbc:mysql://localhost:3306/db_0306?user=root&password=123456","dbtable" -> "my_user"))

5,读取text file
第一种方式:

case class Person(name:String,age:Int)
val people_rdd = sc.textFile("spark/sql/people.txt")
val rowRdd = people_rdd.map(x => x.split(",")).map(x => Person(x(0), x(1).trim.toInt))
val people_df=rowRdd.toDF()

第二种方式:

val people_rdd = sc.textFile("spark/sql/people.txt")
import org.apache.spark.sql._
val rowRdd = people_rdd.map(x => x.split(",")).map(x => Row(x(0), x(1).trim.toInt))

import org.apache.spark.sql.types._
val schema = StructType(Array(StructField("name",StringType, true), StructField("age", IntegerType, false)))

val rdd2df = sqlContext.createDataFrame(rowRdd, schema)

测试:

Spark SQL强大诞生了,

Hive Table
emp
MySQL Table
dept

针对上述两个表进行join,

val hive_emp_df = sqlContext.table("db_0228.emp")
val mysql_dept_df = sqlContext.jdbc("jdbc:mysql://localhost:3306/db_0306?user=root&password=123456", "tb_dept")
val join_df = hive_emp_df.join(mysql_dept_df, hive_emp_df("deptno") === mysql_dept_df("deptno"))
join_df.show

案例分析

SQLLogAnalyzer.scala

package com.ibeifeng.bigdata.spark.app

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


/**
 * Created by XuanYu on 2016/4/17.
 */

object SQLLogAnalyzer {
  def main(args: Array[String]) {

    // create SparkConf instance
    val sparkConf = new SparkConf()
      .setAppName("SQLLogAnalyzer")
      .setMaster("local[2]")
    // create SparkContext instance
    val sc = new SparkContext(sparkConf)

    // create SQLcontext instance
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._

    // ==============================================================
    // input files
    val logFile = "hdfs://bigdata-senior01.ibeifeng.com:8020/user/beifeng/apache.access.log" //

    //create rdd
    val accessLogs_df = sc.textFile(logFile)
      /**
       *  filter log datas
       */
      .filter(ApacheAccessLog.isValidateLogLine)
      /**
       * parse log
       */
      .map(log => ApacheAccessLog.parseLogLine(log))
      .toDF()

    accessLogs_df.registerTempTable("accessLogs")

    // cache
    accessLogs_df.cache()

// =======================================================================================

    // compute
    val avgContentSize = sqlContext.sql("select avg(contentSize) from accessLogs").first().get(0)
    val minContentSize = sqlContext.sql("select min(contentSize) from accessLogs").first().get(0)
    val maxcontentSize = sqlContext.sql("select max(contentSize) from accessLogs").first().get(0)

    // println
    println("Content Size Avg: %s, Min: %s , Max: %s".format(
      avgContentSize, minContentSize, maxcontentSize
    ))

    //
    accessLogs_df.unpersist()

    val avg_df = accessLogs_df.agg("contentSize" -> "avg")
    val min_df = accessLogs_df.agg("contentSize" -> "min")
    val max_df = accessLogs_df.agg("contentSize" -> "max")

    // println
    println(" === Content Size Avg: %s, Min: %s , Max: %s".format(
      avg_df.first().get(0),min_df.first().get(0),max_df.first().get(0)
    ))

    // ==============================================================

    // stop SparkContext
    sc.stop()
  }

}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forrestxingyunfei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值