43、内置函数及每日uv、销售额统计案例
一、spark1.5内置函数
在Spark 1.5.x版本,增加了一系列内置函数到DataFrame API中,并且实现了code-generation的优化。与普通的函数不同,DataFrame的函数并不会执行后立即返回一个结果值,
而是返回一个Column对象,用于在并行作业中进行求值。Column可以用在DataFrame的操作之中,比如select,filter,groupBy等。函数的输入值,也可以是Column。
|
种类 |
函数 |
| 聚合函数 |
approxCountDistinct, avg, count, countDistinct, first, last, max, mean, min, sum, sumDistinct |
|
集合函数 |
array_contains, explode, size, sort_array |
|
日期/时间函数 |
日期时间转换 |
|
日期/时间函数 |
日期/时间计算 |
|
数学函数 |
abs, acros, asin, atan, atan2, bin, cbrt, ceil, conv, cos, sosh, exp, expm1, factorial, floor, hex, hypot, log, log10, log1p, log2, pmod, pow, rint, round, shiftLeft, shiftRight, shiftRightUnsigned, signum, sin, sinh, sqrt, tan, tanh, toDegrees, toRadians, unhex |
|
混合函数 |
array, bitwiseNOT, callUDF, coalesce, crc32, greatest, if, inputFileName, isNaN, isnotnull, isnull, least, lit, md5, monotonicallyIncreasingId, nanvl, negate, not, rand, randn, sha, sha1, sparkPartitionId, struct, when |
|
字符串函数 |
ascii, base64, concat, concat_ws, decode, encode, format_number, format_string, get_json_object, initcap, instr, length, levenshtein, locate, lower, lpad, ltrim, printf, regexp_extract, regexp_replace, repeat, reverse, rpad, rtrim, soundex, space, split, substring, substring_index, translate, trim, unbase64, upper |
|
窗口函数 |
cumeDist, denseRank, lag, lead, ntile, percentRank, rank, rowNumber |
二、案例
案例实战:根据每天的用户访问日志和用户购买日志,统计每日的uv和销售额
1、UV案例scala实现
package cn.spark.study.sql import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.IntegerType
import org.apache.spark.sql.functions._ object DailyUV {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("DailyUV")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc) // 要使用Spark SQL的内置函数,就必须在这里导入SQLContext下的隐式转换
import sqlContext.implicits._ // 构造用户访问日志数据,并创建DataFrame // 模拟用户访问日志,日志用逗号隔开,第一列是日期,第二列是用户id
val userAccessLog = Array(
"2019-08-04,1122",
"2019-08-04,1122",
"2019-08-04,1123",
"2019-08-04,1124",
"2019-08-04,1124",
"2019-08-05,1122",
"2019-08-05,1121",
"2019-08-05,1123",
"2019-08-05,1123"); val userAccessLogRDD = sc.parallelize(userAccessLog, 5) // 将模拟出来的用户访问日志RDD,转换为DataFrame
// 首先,将普通的RDD,转换为元素为Row的RDD
// String到Int : toInt
val userAccessLogRowRDD = userAccessLogRDD
.map { log => Row(log.split(",")(0), log.split(",")(1).toInt) } // 构造DataFrame的元数据
// 将一个RDD转换为DataFrame,这一步经常需要生成一个StructType来生成DataFrame的schema
// 通过StructType直接指定每个字段的schema
val structType = StructType(Array(
StructField("date", StringType, true),
StructField("userid", IntegerType, true))) // 使用SQLContext创建DataFrame
val userAccessLogRowDF = sqlContext.createDataFrame(userAccessLogRowRDD, structType) // 这里讲解一下uv的基本含义和业务
// 每天都有很多用户来访问,但是每个用户可能每天都会访问很多次
// 所以,uv,指的是,对用户进行去重以后的访问总数 // 这里,正式开始使用Spark 1.5.x版本提供的最新特性,内置函数,countDistinct
// 讲解一下聚合函数的用法
// 首先,对DataFrame调用groupBy()方法,对某一列进行分组
// 然后,调用agg()方法 ,第一个参数,必须传入之前在groupBy()方法中出现的字段,前面要写一个单引号
// 第二个参数,传入countDistinct、sum、first等,Spark提供的内置函数
// 内置函数中,传入的参数,也是用单引号作为前缀的,其他的字段
userAccessLogRowDF.groupBy("date")
.agg('date, countDistinct('userid))
.map { row => Row(row(1), row(2)) }
.collect()
.foreach(println) }
}
2、销售额案例scala实现
package cn.spark.study.sql import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.DoubleType
import org.apache.spark.sql.functions._ /**
* @author Administrator
*/ object DailySale { def main(args: Array[String]): Unit = {
val conf = new SparkConf()
.setMaster("local")
.setAppName("DailySale")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc) import sqlContext.implicits._ // 说明一下,业务的特点
// 实际上呢,我们可以做一个,单独统计网站登录用户的销售额的统计
// 有些时候,会出现日志的上报的错误和异常,比如日志里丢了用户的信息,那么这种,我们就一律不统计了 // 模拟数据
val userSaleLog = Array("2019-08-04,55.05,1122",
"2019-08-04,23.15,1133",
"2019-08-04,15.20,",
"2019-08-05,56.05,1144",
"2019-08-05,78.87,1155",
"2019-08-05,113.02,1123")
val userSaleLogRDD = sc.parallelize(userSaleLog, 5) // 进行有效销售日志的过滤
val filteredUserSaleLogRDD = userSaleLogRDD
.filter { log => if (log.split(",").length == 3) true else false } val userSaleLogRowRDD = filteredUserSaleLogRDD
.map { log => Row(log.split(",")(0), log.split(",")(1).toDouble) } val structType = StructType(Array(
StructField("date", StringType, true),
StructField("sale_amount", DoubleType, true))) val userSaleLogDF = sqlContext.createDataFrame(userSaleLogRowRDD, structType) // 开始进行每日销售额的统计
userSaleLogDF.groupBy("date")
.agg('date, sum('sale_amount))
.map { row => Row(row(1), row(2)) }
.collect()
.foreach(println)
} }
43、内置函数及每日uv、销售额统计案例的更多相关文章
- python-面向对象速查表-内置方法-内置函数-内置属性(只整理了部分内容)
今日临时总结的内容,可能还有些不正确的地方,初步当做个速查表吧. 类的内置函数(继承object的,自己重写) 内置函数 执行时机 注意点 调用案例 __init__ 实例化对象时 不允许写返回值(r ...
- Python每日一练------内置函数+内置变量+内置模块
1.内置函数 Python所有的内置函数 Built-in Functions abs() divmod() input() open() staticmethod() all() e ...
- python基础-匿名函数、内置函数、正则表达式、模块
1. 匿名函数 1.1 有名函数 有名函数:定义了一个函数名,函数名指向内存地址:通过函数名进行访问.函数名加括号就可以运行有名函数,例如:func() def func(x, y, z = 1): ...
- 循序渐进Python3(三) -- 1 -- 内置函数
对函数有了一定了解之后,我们来看看Python的内置函数.下图是Python所有的内置函数,共68个.
- Python学习笔记-Day3-python内置函数
python内置函数 1.abs 求绝对值 2.all 判断迭代器中的所有数据是否都为true 如果可迭代的数据的所有数据都为true或可迭代的数据为空,返回True.否则返回False 3.a ...
- Python成长之路第二篇(1)_数据类型内置函数用法
数据类型内置函数用法int 关于内置方法是非常的多这里呢做了一下总结 (1)__abs__(...)返回x的绝对值 #返回x的绝对值!!!都是双下划线 x.__abs__() <==> a ...
- Orace内置函数大全[转:http://www.cnblogs.com/lfx0692/articles/2395950.html]
NewProgramer Oracle SQL 内置函数大全(转) SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,a ...
- python全栈开发-Day13 内置函数
一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...
- Python中内置函数的介绍
内置函数的功能介绍 常用内置函数如下: 1.abs() 绝对值 格式:abs(x) 例如:print(abs(-18)) >>> 18 返回值:number #该函数主要用于数值类的 ...
随机推荐
- NOI2017
整数(线段树) 不难想到按位处理,位数比较多考虑使用动态开点线段树维护大数,那么复杂度是\(O(nlog^2n)\)的,不够优秀. 但注意到我们需要支持的是二进制下的加减法,而在二进制下我们可以使用i ...
- C# vb .net实现高斯模糊
在.net中,如何简单快捷地实现Photoshop滤镜组中的高斯模糊效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- angular 8 配置路由
一.生成路由文件 按照惯例,有一个独立模块来配置相关路由,这个模块类的名字叫做AppRoutingModule,位于src/app下的app-routing.module.ts文件中. 使用CLI生成 ...
- fastDFS遇到的并发问题recv cmd: 0 is not correct, expect cmd: 100
这种异常一般发生在 多线程同时使用一个StorageClient操作文件的情况下.有两种解决办法:1.对StorageClient对象加锁,变成单线程2.每次下载或上传文件时,重新new一个Stora ...
- 分享linux系统more基本命令python源码
此python源码是linux系统more基本命令的实现. 实现linux中more的基本功能,当more后加一个文件名参数时候,分屏显示按空格换页,按回车换行',在左下角显示百分比; 以处理管道参数 ...
- Delphi INI 文件读写
delphi中,配置文件的相关操作. () INI文件的结构: ;这是关于INI文件的注释部分 [节点] 关键字=值 ... INI文件允许有多个节点,每个节点又允许有多个关键字, “=”后面是该关键 ...
- 小程序canvas绘制倒计时
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 效果展示: //广告倒计时 advTimeCountDown:function(advTime ...
- spark 机器学习 随机森林 原理(一)
1.什么是随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决 策树之间是没有关联的.在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分 ...
- Qt命名规范
1) 类名:单词首字母大写,单词和单词之间直接连接,无需连接字符 如: MyClass,QPushButton class MainWindow { }; 2) 函数名字,变量名:第二个单词开始(不是 ...
- git---怎样将分支上的一个单文件合并到主分支上(master)
一.首先切换到主分支 注意将分支上的数据全部提交 以免造成数据冲突或丢失 git checkeout master 二.选择要合并的文件 git checkout --patch 分支名称 要合并 ...