1.大数据开发面试必问:Hive调优技巧系列一
2.hive 时间相关函数使用笔记
3.SparkSQLåHiveå¨åcast booleanåå¨çä¸å
4.å¦ä½ä½¿ç¨Spark SQL çJDBC server
5.Hive sql - 常用窗口函数(万字超详解)
6.Hive sql - 常用时间函数大全
大数据开发面试必问:Hive调优技巧系列一
Hive调优拆解
Hive建表优化
Hive SQL 是源码互联网分析师必备技能。掌握HQL基础,源码了解Hive优化,源码是源码必备技能。本篇文章将从Hive建表优化、源码HQL语法优化、源码移动棋牌源码数据倾斜优化、源码HiveJob优化四大方面进行系统讲解,源码带你全面了解Hive优化。源码1.1 分区表
分区表能减少计算时的源码数据量。分区表在HDFS上对应独立文件夹,源码存放该分区数据。源码常用于WHERE子句中的源码字段作为分区字段,提高查询效率。源码1.1.1 分区表基本操作
创建分区表语法
查询分区表数据
增加分区
删除分区
查看分区表分区数
思考:面对大量日志数据,源码如何合理拆分?1.1.2 动态分区
动态分区无需预先确定分区字段值,Hive提供类似机制。需进行配置。1.2 分桶表
分桶表在数据管理中提供更精细的划分,方便抽样和提高join效率。通过分桶,数据集被分解为更易管理的求职面试源码部分。1.2.1 分桶表操作
创建分桶表
查看表结构
导入数据
查询分桶数据
注意:reduce设置、避免本地文件问题、避免使用本地模式、插入数据方式。1.2.2 抽样查询
对于大数据集,可使用抽样查询获取代表性结果。1.3 文件格式优化
Hive支持多种文件格式。列式存储和行式存储各有优势。列式存储适合查询特定字段,减少读取量;行式存储查询整行数据时更高效。1.3.1 列式与行式存储
行存储特点:查询整行数据更高效。
列存储特点:减少读取特定字段的数据量,设计压缩算法。
1.3.2 TextFile与Orc
TextFile默认格式,不压缩,磁盘开销大,不支持并行操作。
Orc支持压缩,提高性能。
1.3.3 Parquet
Parquet格式文件二进制存储,自解析,idea idk源码支持压缩。1.4 压缩格式选择
Hadoop引入编码器支持多种压缩算法。选择合适的压缩格式以提高性能。2. HQL语法优化
2.1 列裁剪与分区裁剪
优化查询时,仅读取需要的列与分区,减少开销。2.2 Group By
Map阶段聚合操作可提高效率,避免数据倾斜。2.3 Vectorization
矢量计算技术在扫描、过滤、聚合时提高效率。2.4 多重模式
优化重复SQL,减少全表扫描次数。2.5 in/exists语句
使用left semi join替代in/exists,优化性能。2.6 CBO优化
自动优化Join顺序与算法,选择最佳执行计划。2.7 谓词下推
提前执行where条件,减少下游处理数据量。2.8 MapJoin
将小表直接加载内存进行Join操作,提高速度。源码分析验证2.9 大表优化
SMB Join解决大表Join问题,分桶技术分解大表。 下期将继续讨论数据倾斜与HiveJob优化。 深入掌握Hive调优,欢迎参加企业调优实战课程。hive 时间相关函数使用笔记
在日常工作中,我们经常需要在Hive中使用时间相关的函数来处理日期和时间数据。本文将总结Hive中的时间转换函数,并与Presto进行对比,以方便大家查阅和使用。
1.时间戳函数转换
1.1日期格式转换时间戳
时间戳转换为精确到秒的日期格式,只有位长度,而非位。函数格式为`unix_timestamp(date,dateformat)`。需要注意的是,日期中的月份M必须大写,否则会被识别为时分秒中的"分"。
1.2时间戳转换成日期格式
函数格式为`from_unixtime(timestamp,dateformat)`,用于将时间戳转换为指定格式的日期。
2.把字符串或日期转换成指定格式的日期
使用`date_format(string/date,dateformate)`函数,可将字符串或日期转换为指定格式的unity源码培训日期。默认情况下,`to_date(date)`函数会返回`yyyy-MM-dd`格式的日期。
3.计算两个日期的差值
3.1使用`datediff(date1,date2)`函数计算两个日期之间的差值,需要注意的是,`datediff`函数中的参数必须是日期格式。
3.2使用时间戳相减。若结果显示为天,需要将秒转换为天。
4.日期加减/月份加减
4.1使用`date_add(date,n)`和`date_sub(date,n)`函数进行日期加减。`date_add`函数参数n为正数时向后推n天,负数时则向前推n天;`date_sub`函数相反。
4.2使用`add_months(date,m)`函数进行月份加减。参数m为正数时向后推m个月,负数时则向前推m个月。
总结来说,Hive提供了一系列丰富的时间转换函数,帮助我们更灵活地处理日期和时间数据。通过本文的总结,希望能帮助到大家在实际工作中更加高效地使用这些函数。
SparkSQLåHiveå¨åcast booleanåå¨çä¸å
ä»å¤©å¨çä¸äºæ°æ®çæ¶ååç°,ä¸äºSparkSQLä¸Hiveä¹é´å¨è¿è¡cast转åæ¶ååå¨ä¸äºå·®å¼ã
HiveVersion 1.2.1
SparkSQL 1.6.0
æ»ç»:
å¨Hiveä¸, booleanç±»åçéå¼è½¬å,Hiveä¸ébooleanénull转åé»è®¤ä¸ºTrue,
èå¨SparkSQLä¸ï¼åæ ¹æ®ä¼ å ¥çä¸åæ°æ®ç±»åå¤æå¼åè¿åç»æ.
Hive
Converts the results of the expression expr to . For example,
cast(â1â as BIGINT) will convert the string â1â to its integral representation.
A null is returned if the conversion does not succeed.
If cast(expr as boolean) Hive returns true for a non-empty string.
hive> select cast('false' as boolean) from default.dule;
OK
true
SparkSQL
å¨SparkSQLä¸å¦ææ¯stringçè¯ï¼ä¼æ£æ¥StringUtilsä¸æ举çï¼å ¶ä»ååç±»åæ°æ®è¿è¡æ¯å¦ä¸çäº0,ä¸çäº0è¿åtrueï¼å¦å为false
å ·ä½ä»£ç é»è¾å¦ä¸
classname: org.apache.spark.sql.catalyst.expressions.Cast
// UDFToBoolean
private[this] def castToBoolean(from: DataType): Any => Any = from match {
case StringType =>
buildCast[UTF8String](_, s => {
if (StringUtils.isTrueString(s)) {
true
} else if (StringUtils.isFalseString(s)) {
false
} else {
null
}
})
case TimestampType =>
buildCast[Long](_, t => t != 0)
case DateType =>
// Hive would return null when cast from date to boolean
buildCast[Int](_, d => null)
case LongType =>
buildCast[Long](_, _ != 0)
case IntegerType =>
buildCast[Int](_, _ != 0)
case ShortType =>
buildCast[Short](_, _ != 0)
case ByteType =>
buildCast[Byte](_, _ != 0)
case DecimalType() =>
buildCast[Decimal](_, !_.isZero)
case DoubleType =>
buildCast[Double](_, _ != 0)
case FloatType =>
buildCast[Float](_, _ != 0)
}
classname: org.apache.spark.sql.catalyst.util.StringUtils
//
private[this] val trueStrings = Set("t", "true", "y", "yes", "1").map(UTF8String.fromString)
private[this] val falseStrings = Set("f", "false", "n", "no", "0").map(UTF8String.fromString)
def isTrueString(s: UTF8String): Boolean = trueStrings.contains(s.toLowerCase)
def isFalseString(s: UTF8String): Boolean = falseStrings.contains(s.toLowerCase)
å¦ä½ä½¿ç¨Spark SQL çJDBC server
ããè¿è¡ç¯å¢
é群ç¯å¢ï¼CDH5.3.0
å ·ä½JARçæ¬å¦ä¸ï¼
sparkçæ¬ï¼1.2.0-cdh5.3.0
hiveçæ¬ï¼0..1-cdh5.3.0
hadoopçæ¬ï¼2.5.0-cdh5.3.0
å¯å¨ JDBC server
cd /etc/spark/conf
ln -s /etc/hive/conf/hive-site.xml hive-site.xml
cd /opt/cloudera/parcels/CDH/lib/spark/
chmod- -R logs/
cd /opt/cloudera/parcels/CDH/lib/spark/sbin
./start-thriftserver.sh --master yarn --hiveconf hive.server2.thrift.port=
Connecting to the JDBC server with Beeline
cd /opt/cloudera/parcels/CDH/lib/spark/bin
beeline -u jdbc:hive2://hadoop:
[root@hadoop bin]# beeline -u jdbc:hive2://hadoop:
scan complete in 2ms
Connecting to jdbc:hive2://hadoop:
Connected to: Spark SQL (version 1.2.0)
Driver: Hive JDBC (version 0..1-cdh5.3.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 0..1-cdh5.3.0 by Apache Hive
0: jdbc:hive2://hadoop:>
Working with Beeline
Within the Beeline client, you can use standard HiveQL commands to create, list, and query tables. You can find the full details of HiveQL in the Hive Language Manual,but here, we show a few common operations.
CREATE TABLE IF NOT EXISTS mytable (key INT, value STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
create table mytable(name string,addr string,status string) row format delimited fields terminated by '#'
#å è½½æ¬å°æ件
load data local inpath '/external/tmp/data.txt' into table mytable
#å è½½hdfsæ件
load data inpath 'hdfs://junn/external/tmp/data.txt' into table mytable;
describe mytable;
explain select * from mytable where name = 'å¼ ä¸'
select * from mytable where name = 'å¼ ä¸'
cache table mytable
select count(*) total,count(distinct addr) num1,count(distinct status) num2 from mytable where addr='gz';
uncache table mytable
使ç¨æ°æ®ç¤ºä¾
å¼ ä¸#广å·#å¦ç
æå#è´µå·#æå¸
çäº#æ¦æ±#讲å¸
èµµå #æé½#å¦ç
lisa#广å·#å¦ç
lily#gz#studene
Standalone Spark SQL Shell
Spark SQL also supports a simple shell you can use as a single process: spark-sql
å®ä¸»è¦ç¨äºæ¬å°çå¼åç¯å¢ï¼å¨å ±äº«é群ç¯å¢ä¸ï¼è¯·ä½¿ç¨JDBC SERVER
cd /opt/cloudera/parcels/CDH/lib/spark/bin
./spark-sql
Hive sql - 常用窗口函数(万字超详解)
Hello~我是高月!我将会在这篇文章中为你详细介绍 Hive sql 中常用的窗口函数。
窗口函数是指在特定的数据滑动窗口内,执行各种统计分析的操作。
在日常使用中,窗口函数通常与分析函数或专用窗口函数结合使用,形成如窗口聚合函数、窗口排序函数等实用函数。
具体使用语法如下:
1.1 什么是分析函数和专用窗口函数?
常用的分析函数包括:sum()、max()、min()、avg()、count()等。
专用窗口函数有:row_number()、rank()、dense_rank()等。
1.2 什么是窗口函数?
窗口函数由三个部分组成,可以单独使用,也可以混合使用,也可以全都不用。以下是语法拆解:
对指定的字段进行分组,后续操作都是以组为单位,将每个分组作为一个独立的窗口进行统计分析。
案例 :对窗口中的数据求和,并将求和结果分配到对应窗口的每一条数据中。
案例 :对整体数据求和,并将求和结果分配到每一条数据中。
当使用order by与partition by结合时,可以对各个分组内的数据按照指定的字段进行排序。如果没有partition by指定分组字段,则会对全局数据进行排序。
案例 :对数据进行全局排序。
案例 :当排序维度不存在重复时,即order by指定的字段,使用order by + 分析函数sum(),可以产生求整体累计数的效果。
但是当order by指定的字段存在重复时,在不重复的数据中会产生累计效果,而在重复的数据中,会把整体的累计结果分配到每条重复的数据中。
案例 :当排序维度不存在重复时,即order by指定的字段,partition by与order by结合使用,并使用分析函数sum(),可以产生求窗口中累计数的效果。
但是当order by指定的字段组合存在重复时,在不重复的数据中会产生累计效果,而在重复的数据中,也会把整体的累计结果分配到每条重复的数据中。
rows between用于划分窗口中函数作用的数据范围。以下例子有助于加深rows between的理解。
rows between常用的参数如下:
① n preceding:往前
② n following:往后
③ current row:当前行
④ unbounded:起点(一般结合preceding,following使用)
使用例子如下:
rows between unbounded preceding and current row与partition by、order by结合使用,可以产生对窗口中的数据求累计数的效果。
2. 排序窗口函数
2.1 排序并产生自增编号,自增编号不重复且连续
我们可以使用函数:row_number() over()
数据样例:
具体语法如下:
案例如下:
2.2 排序并产生自增编号,自增编号会重复且不连续
我们可以使用函数:rank() over()
数据样例:
具体语法如下:
案例如下:
2.3 排序并产生自增编号,自增编号会重复且连续
我们可以使用函数:dense_rank() over()
数据样例:
具体语法如下:
案例如下:
3. 聚合窗口函数
3.1 求窗口中的累计值
我们可以使用:sum() over()
3.2 求窗口中3天的平均价格
我们可以使用 avg() over()
3.3 求分组中的最大值/最小值
3.4 求分组中的总记录数
4. 位移窗口函数
4.1 获取分组中往前n行的值
基础语法:
语法解析:
1. field 是指定的列名
2. n 是往前的行数
3. 行往前导致的最后的n行值为null,可以用default_value代替。
使用案例:
4.2 获取分组中往后n行的值
基础语法:
语法解析:
1. field 是指定的列名
2. n 是往前的行数
3. 行往后导致的,前面的n行值为null,可以用default_value代替。
使用案例:
5. 极值窗口函数
5.1 获取分组内第一行的值
我们可以使用first_value(col,true/false) over(),作用是:取分组内排序后,截止到当前行,第一个值。
注意:
案例:将每行数据换成当前窗口指定字段的第一个值
5.2 获取分组内最后一行的值
我们可以使用last_value(col,true/false) over(),作用是:取分组内排序后,截止到当前行,最后一个值。所以,如果使用order by排序时,想要取最后一个值,需要与rows between unbounded preceding and unbounded following连用。
注意:
相信大家都发现了,在本案例中,我们使用order by时与rows between unbounded preceding and unbounded following连用了,这是需要注意的一个点,如果不连用,将会产生以下效果:
6. 分箱窗口函数
ntile() over() 分箱窗口函数,用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加到第一个切片中。
案例:查询成绩前%的人。
文章到这里就结束啦,如果喜欢这篇文章,请点赞、关注、收藏哦!
如果你有想知道的知识,欢迎评论区留言,我会持续输出相关文章内容的~
Hive sql - 常用时间函数大全
Hive SQL中的时间函数非常实用,能够处理各种日期和时间格式转换。以下是一些常用的时间函数概览: 1. 获取当前时间:1.1 通过`current_date`或`current_timestamp`获取年月日格式:`to_date(current_timestamp, 'yyyy-MM-dd')`
1.2 用`current_timestamp`获取完整时间戳:`current_timestamp`
2. 时间戳操作:2.1 `from_unixtime(timestamp_column)`将时间戳转换为日期时间格式
2.2 `unix_timestamp(date_column)`将日期转换为时间戳
3. 格式化时间:将含时分秒的时间转为'yyyy-MM-dd'格式:`date_format(date_column, 'yyyy-MM-dd')`
4. 时间处理:将时间调整到特定格式:自定义函数或使用`date_format`和`time_format`
5. 获取指定时间的详细信息:6.1-6.7 分别对应`year`, `quarter`, `month`, `day`, `hour`, `minute`, `second`函数
6. 时间区间操作:7.1 `date_add(date_column, interval 'n' day)`和`date_sub(date_column, interval 'n' day)`计算前后n天
7.2 类似地,有`interval 'n' month`操作
7. 日期位置判断:. `dayofyear(date_column)` - 一年中的第几天
. `dayofmonth(date_column)` - 月份中的第几天
. `last_day(date_column)` - 当月最后一天
8. 日期和周的处理:. 获取下一个星期几:`next_day(date_column, 'weekday')`
. 时间差:`datediff(date1_column, date2_column)`
9. 年月的开始和结束:. `date_add(date_column, interval '-1 day')`获取上一天,`interval '1 month'`获取下一个月的第一天等
. 本周和上周的特定日期:. `last_day(add_months(current_date, -1))`上周第一天,`next_day(current_date, 'Monday')`本周第一天
. 时间成分提取:. 使用`extract`函数提取年、月、日等:`extract(year from date_column)`
. 时区转换:使用`from_utc_timestamp`和`to_utc_timestamp`处理时区问题