一、概述

组件

运行机制

转 SparkSQL – 从0到1认识Catalyst  https://blog.csdn.net/qq_36421826/article/details/81988157

深入研究Spark SQL的Catalyst优化器(原创翻译)

更高效

查询优化

优化:把filter提前

数据源优化

编译优化 Code generation

DataSet和DataFrame

数据源

Parquet文件

Json文件

读取Hive中文件

外部数据源spark.read.format

二、程序设计

常规流程

API:SQL与DataFrame DSL

统计分析内容大小-全部内容大小,日志条数,最小内容大小,最大内容大小

package org.sparkcourse.log

import org.apache.spark.sql.{Row, SparkSession}

object LogAnalyzerSQL {
def main(args: Array[String]): Unit = { val spark = SparkSession.builder()
.appName("Log Analyzer")
.master("local")
.getOrCreate() import spark.implicits._ val accessLogs = spark
.read
.textFile("data/weblog/apache.access.log")
.map(ApacheAccessLog.parseLogLine).toDF() accessLogs.createOrReplaceTempView("logs") // 统计分析内容大小-全部内容大小,日志条数,最小内容大小,最大内容大小
val contentSizeStats: Row = spark.sql("SELECT SUM(contentSize), COUNT(*), MIN(contentSize), MAX(contentSize) FROM logs").first()
val sum = contentSizeStats.getLong(0)
val count = contentSizeStats.getLong(1)
val min = contentSizeStats.getLong(2)
val max = contentSizeStats.getLong(3)
println("sum %s, count %s, min %s, max %s".format(sum, count, min, max))
println("avg %s", sum / count)
spark.close() }
}

ApacheAccessLog

package org.sparkcourse.log

import sun.security.x509.IPAddressName

case class ApacheAccessLog(ipAddress: String,
clientIdentd: String,
userId: String,
dateTime: String,
method: String,
endpoint: String,
protocol: String,
responseCode: Int,
contentSize: Long){
} object ApacheAccessLog {
// 64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
val PATTERN = """^(\S+) (\S+) (\S+) \[([\w:/]+\s+\-\d{4})\] "(\S+) (\S+) (\S+)" (\d{3}) (\d+)""".r def parseLogLine(log: String): ApacheAccessLog = {
log match {
case PATTERN(ipAddress, clientIdentd, userId, dateTime, method, endpoint, protocol, responseCode, contentSize)
=> ApacheAccessLog(ipAddress, clientIdentd, userId, dateTime, method, endpoint, protocol, responseCode.toInt, contentSize.toLong)
case _ => throw new RuntimeException(s"""Cannot parse log line: $log""")
}
}

String 的 .r 方法 将字符串转为正则表达式

方式一: 通过case class创建DataFrames(反射)

TestDataFrame1.scala

package com.bky

// 隐式类的导入
// 定义case class,相当于表结构
case class Dept(var id:Int, var position:String, var location:String) // 需要导入SparkSession这个包
import org.apache.spark.sql.SparkSession /**
* 方式一: 通过case class创建DataFrames(反射)
*/
object TestDataFrame1 { def main(args: Array[String]): Unit = { /**
* 直接使用SparkSession进行文件的创建。
* 封装了SparkContext,SparkConf,SQLContext,
* 为了向后兼容,SQLContext和HiveContext也被保存了下来
*/
val spark = SparkSession
.builder() //构建sql
.appName("TestDataFrame1") // 设置文件名
.master("local[2]") // 设置executor
.getOrCreate() //获取或创建 import spark.implicits._ // 隐式转换
// 将本地的数据读入RDD,将RDD与case class关联
val deptRDD = spark.read.textFile("/Users/hadoop/data/dept.txt")
.map(line => Dept(line.split("\t")(0).toInt,
line.split("\t")(1),
line.split("\t")(2).trim)) // 将RDD转换成DataFrames(反射)
val df = deptRDD.toDF() // 将DataFrames创建成一个临时的视图
df.createOrReplaceTempView("dept") // 使用SQL语句进行查询
spark.sql("select * from dept").show() }
}

精简版 TestDataFrame1.scala

package com.bky

import org.apache.spark.sql.SparkSession

object TestDataFrame1 extends App {
val spark = SparkSession
.builder() //构建sql
.appName("TestDataFrame1")
.master("local[2]")
.getOrCreate() import spark.implicits._
val deptRDD = spark.read.textFile("/Users/hadoop/data/dept.txt")
.map(line => Dept(line.split("\t")(0).toInt,
line.split("\t")(1),
line.split("\t")(2).trim)) val df = deptRDD.toDF()
df.createOrReplaceTempView("dept")
spark.sql("select * from dept").show()
} case class Dept(var id:Int, var position:String, var location:String)

方式二:通过创建structType创建DataFrames(编程接口)

TestDataFrame2.scala

package com.bky

import org.apache.spark.sql.types._
import org.apache.spark.sql.{Row, SparkSession} /**
*
* 方式二:通过创建structType创建DataFrames(编程接口)
*/
object TestDataFrame2 extends App { val spark = SparkSession
.builder()
.appName("TestDataFrame2")
.master("local[2]")
.getOrCreate() /**
* 将RDD数据映射成Row,需要导入import org.apache.spark.sql.Row
*/
import spark.implicits._
val path = "/Users/hadoop/data/dept.txt"
val fileRDD = spark.read.textFile(path)
val rowRDD= fileRDD.map(line => {
val fields = line.split("\t")
Row(fields(0).toInt, fields(1), fields(2).trim)
}) // 创建StructType来定义结构
val innerStruct = StructType(
// 字段名,字段类型,是否可以为空
StructField("id", IntegerType, true) ::
StructField("position", StringType, true) ::
StructField("location", StringType, true) :: Nil
) val df = spark.createDataFrame(innerStruct)
df.createOrReplaceTempView("dept")
spark.sql("select * from dept").show() }

方式三:通过json文件创建DataFrames

TestDataFrame3.scala

package com.bky

import org.apache.spark.sql.SparkSession

/**
* 方式三:通过json文件创建DataFrames
*/
object TestDataFrame3 extends App { val spark = SparkSession
.builder()
.master("local[2]")
.appName("TestDataFrame3")
.getOrCreate() val path = "/Users/hadoop/data/test.json"
val fileRDD = spark.read.json(path)
fileRDD.createOrReplaceTempView("test")
spark.sql("select * from test").show()
}

统计每种返回码的数量

package org.sparkcourse.log

import org.apache.spark.sql.{Row, SparkSession}

object LogAnalyzerSQL {
def main(args: Array[String]): Unit = { val spark = SparkSession.builder()
.appName("Log Analyzer")
.master("local")
.getOrCreate() import spark.implicits._ val accessLogs = spark
.read
.textFile("data/weblog/apache.access.log")
.map(ApacheAccessLog.parseLogLine).toDF() accessLogs.createOrReplaceTempView("logs") // 统计每种返回码的数量.
val responseCodeToCount = spark.sql("SELECT responseCode, COUNT(*) FROM logs GROUP BY responseCode LIMIT 100")
.map(row => (row.getInt(0), row.getLong(1)))
.collect()
responseCodeToCount.foreach(print(_))
}
}

统计哪个IP地址访问服务器超过10次

package org.sparkcourse.log

import org.apache.spark.sql.{Row, SparkSession}

object LogAnalyzerSQL {
def main(args: Array[String]): Unit = { val spark = SparkSession.builder()
.appName("Log Analyzer")
.master("local")
.getOrCreate() import spark.implicits._ val accessLogs = spark
.read
.textFile("data/weblog/apache.access.log")
.map(ApacheAccessLog.parseLogLine).toDF() accessLogs.createOrReplaceTempView("logs") // 统计哪个IP地址访问服务器超过10次
val ipAddresses = spark.sql("SELECT ipAddress, COUNT(*) AS total FROM logs GROUP BY ipAddress HAVING total > 10 LIMIT 100")
.map(row => row.getString(0))
.collect()
ipAddresses.foreach(println(_))
}
}

查询访问量最大的访问目的地址

package org.sparkcourse.log

import org.apache.spark.sql.{Row, SparkSession}

object LogAnalyzerSQL {
def main(args: Array[String]): Unit = { val spark = SparkSession.builder()
.appName("Log Analyzer")
.master("local")
.getOrCreate() import spark.implicits._ val accessLogs = spark
.read
.textFile("data/weblog/apache.access.log")
.map(ApacheAccessLog.parseLogLine).toDF() accessLogs.createOrReplaceTempView("logs") // 查询访问量最大的访问目的地址
val topEndpoints = spark.sql("SELECT endpoint, COUNT(*) AS total FROM logs GROUP BY endpoint ORDER BY total DESC LIMIT 10")
.map(row => (row.getString(0), row.getLong(1)))
.collect()
topEndpoints.foreach(println(_)) }
}

SparkSQL(一)的更多相关文章

  1. 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件

    这个大坑... .... 如题,在Windows的eclipse中编写SparkSQL代码时,编写如下代码时,一运行就抛出一堆空指针异常: // 首先还是创建SparkConf SparkConf c ...

  2. sparksql udf的运用----scala及python版(2016年7月17日前完成)

    问:udf在sparksql 里面的作用是什么呢? 答:oracle的存储过程会有用到定义函数,那么现在udf就相当于一个在sparksql用到的函数定义: 第二个问题udf是怎么实现的呢? regi ...

  3. spark-sql性能测试

    一,测试环境       1) 硬件环境完全相同:              包括:cpu/内存/网络/磁盘Io/机器数量等       2)软件环境:              相同数据       ...

  4. SparkSQL读取Hive中的数据

    由于我Spark采用的是Cloudera公司的CDH,并且安装的时候是在线自动安装和部署的集群.最近在学习SparkSQL,看到SparkSQL on HIVE.下面主要是介绍一下如何通过SparkS ...

  5. SparkSQL(源码阅读三)

    额,没忍住,想完全了解sparksql,毕竟一直在用嘛,想一次性搞清楚它,所以今天再多看点好了~ 曾几何时,有一个叫做shark的东西,它改了hive的源码...突然有一天,spark Sql突然出现 ...

  6. Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .SparkSQL的发展历程 1.1 Hive and Shark SparkSQL的前身是 ...

  7. Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.1  运行环境说明 1.1.1 硬软件环境 线程,主频2.2G,10G内存 l  虚拟软 ...

  8. Spark入门实战系列--6.SparkSQL(下)--Spark实战应用

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .运行环境说明 1.1 硬软件环境 线程,主频2.2G,10G内存 l  虚拟软件:VMwa ...

  9. 大数据——sparksql

    sparksql:http://www.cnblogs.com/shishanyuan/p/4723604.html?utm_source=tuicool spark on yarn :http:// ...

  10. SparkSql 不支持Date Format (支持Timestamp)

    最近项目中需要用到sparksql ,需要查询sql Date类型, 无奈,官方现阶段 1.6.0 还不支持Date类型,不过支持Timestamp类型,所以问题可以解决了. 1.解析 SimpleD ...

随机推荐

  1. linux-redis-install

    安装redis3.2.9 wget cd make 编译完成后,将redis-cli redis-server redis-conf redis-benchmark配置文件复制到usr/redis文件 ...

  2. 【串线篇】SpringMvc视图解析

    一. 请求处理方法执行完成后,最终返回一个 ModelAndView 对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个 ...

  3. 【leetcode】207. Course Schedule

    题目如下: There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have ...

  4. C/C++ C++ 11 std::move()

    { 0. C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意 是想把参数push_back进去就行 ...

  5. UVa 11806 Cheerleaders (容斥原理+二进制表示状态)

    In most professional sporting events, cheerleaders play a major role in entertaining the spectators. ...

  6. OC学习篇之---内存管理介绍和使用

    在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中 ...

  7. windows 下redis在后台运行

    打开命令终端,cd进入redis目录 安装redis服务:redis-server --service-install redis.windows.conf --loglevel verbose re ...

  8. 前端每日实战:58# 视频演示如何用纯 CSS 创作一只卡通鹦鹉

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vrRmWy 可交互视频 此视频是可 ...

  9. 【已转移】【Java架构:基础技术】一篇文章搞掂:Spring

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<SPRING实战第4版>的总结,大家也可以去仔细研读该书 [------------------------ ...

  10. 机器学习笔记--classification_report&精确度/召回率/F1值

    https://blog.csdn.net/akadiao/article/details/78788864 准确率=正确数/预测正确数=P 召回率=正确数/真实正确数=R F1 F1值是精确度和召回 ...