SparkSQL(一)
一、概述
组件
运行机制
转 SparkSQL – 从0到1认识Catalyst https://blog.csdn.net/qq_36421826/article/details/81988157
更高效
查询优化
优化:把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(一)的更多相关文章
- 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件
这个大坑... .... 如题,在Windows的eclipse中编写SparkSQL代码时,编写如下代码时,一运行就抛出一堆空指针异常: // 首先还是创建SparkConf SparkConf c ...
- sparksql udf的运用----scala及python版(2016年7月17日前完成)
问:udf在sparksql 里面的作用是什么呢? 答:oracle的存储过程会有用到定义函数,那么现在udf就相当于一个在sparksql用到的函数定义: 第二个问题udf是怎么实现的呢? regi ...
- spark-sql性能测试
一,测试环境 1) 硬件环境完全相同: 包括:cpu/内存/网络/磁盘Io/机器数量等 2)软件环境: 相同数据 ...
- SparkSQL读取Hive中的数据
由于我Spark采用的是Cloudera公司的CDH,并且安装的时候是在线自动安装和部署的集群.最近在学习SparkSQL,看到SparkSQL on HIVE.下面主要是介绍一下如何通过SparkS ...
- SparkSQL(源码阅读三)
额,没忍住,想完全了解sparksql,毕竟一直在用嘛,想一次性搞清楚它,所以今天再多看点好了~ 曾几何时,有一个叫做shark的东西,它改了hive的源码...突然有一天,spark Sql突然出现 ...
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .SparkSQL的发展历程 1.1 Hive and Shark SparkSQL的前身是 ...
- Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.1 运行环境说明 1.1.1 硬软件环境 线程,主频2.2G,10G内存 l 虚拟软 ...
- Spark入门实战系列--6.SparkSQL(下)--Spark实战应用
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .运行环境说明 1.1 硬软件环境 线程,主频2.2G,10G内存 l 虚拟软件:VMwa ...
- 大数据——sparksql
sparksql:http://www.cnblogs.com/shishanyuan/p/4723604.html?utm_source=tuicool spark on yarn :http:// ...
- SparkSql 不支持Date Format (支持Timestamp)
最近项目中需要用到sparksql ,需要查询sql Date类型, 无奈,官方现阶段 1.6.0 还不支持Date类型,不过支持Timestamp类型,所以问题可以解决了. 1.解析 SimpleD ...
随机推荐
- matlab采用GPU运算
>>help gpuThere are several options available for using your computer's graphics processing un ...
- Es学习第二课, ES安装和客户端使用
Elasticsearch安装依赖于jdk,所以大家先保证自己电脑安装好Java环境(JDK7或更高版本),并配置好环境变量:这块的配置我就不细讲了,不管是Linux还是Windows,这块的安装和配 ...
- Tomcat6 只允许指定域名访问,禁用IP地址访问,防止恶意解析
运维网监控突然同事反应,在百度上搜索其他域名,竟然打开了和我们P2P一模一样的网站,我第一个反应是源代码被盗用了.后来发现,是域名被恶意解析了,解决方法 1.禁止IP地址访问项目 2.只允许指定的域名 ...
- I2C_24c02实验
一.RCC初始化 /* Setup the microcontroller system. Initialize the Embedded Flash Interface, initialize th ...
- 【dart学习】-- Dart之JSON
概述 现在很难想象移动应用程序不需要与后台交互或者存储结构化数据.现在开发,数据传输方式基本都是用JSON,在Flutter中是没有GSON/Jackson/Moshi这些库,因为这些库需要运行时反射 ...
- Python之-异常处理
1.python中处理异常的方式 #coding:utf8 filename=raw_input("请输入你要操作的文件") try: f=open(filename) print ...
- uploadify的使用错误
在看singwa的视频教程中,学习使用hui-admin模版,在使用uploadify插件上传图片中出现错误. ReferenceError: Can't find variable: $因为使用JQ ...
- Spring事物的传播
spring的事物对于同一个类内部调用是不会生效的. 比如一个ServiceA,里面有个方法x()和y().其中x没有配置事物,而y配置的有实物.如果是一个没有事物的ServiceB调用了Servic ...
- C. Ancient Berland Circus(三点确定最小多边形)
题目链接:https://codeforces.com/problemset/problem/1/C 题意:对于一个正多边形,只给出了其中三点的坐标,求这个多边形可能的最小面积,给出的三个点一定能够组 ...
- Python文章导航
1.Python+Eclipse安装.配置: http://www.cnblogs.com/rhyswang/p/8087752.html 2.数学运算及math库: http://www.cnblo ...