首页
留言页面
归档
友情链接
Search
1
navicat和idea的那啥方法
221 阅读
2
开始了新征途,出发
124 阅读
3
关于操蛋的四月的一些碎碎念
117 阅读
4
面试题 — 连续登录问题的简单记录
61 阅读
5
重建站的碎碎念
55 阅读
默认分类
linux
leetcode
hive
数据结构
登录
/
注册
Search
标签搜索
hive
情感
生活随感
海绵
累计撰写
29
篇文章
累计收到
6
条评论
今日撰写
0
篇文章
首页
栏目
默认分类
linux
leetcode
hive
数据结构
页面
留言页面
归档
友情链接
用户登录
登录
注册
搜索到
11
篇与
hive
的结果
2022-04-14
HIve中的函数
函数的分类hive中函数可以分为三类。这里的 一 , 多代表的是函数UDF 一进一出UDAF 多进一出UDTF 一进多出查看函数的描述desc function extended xxx;常用函数nvlNVL( value,default_value)。如果前者是空,则返回后者。case whenCASE WHEN THEN ELSE END AS XX。老熟悉了不介绍了concat拼接字符串concat_ws按照某一个规则拼接字符串。concat_ws(‘-’,’a’,’b’)。其中第一个是分隔符。算是一个特殊的 concat 函数,不推荐使用。而且指定了参数了类型。字符串或者数组。collect_set把数据放到一个set里面,返回一个去重之后的数组。collect_list跟上面一样,但是不会去重。coalesce返回第一个不为null的值,如果都为null,则返回null行转列列转行EXPLODE(col):将 hive 一列中复杂的 Array 或者 Map 结构拆分成多行。但是要求 数组的这个形式,所以要使用 split 这个函数去分割,这个函数分割完了之后返回的是数组的形式。也就符合了 explode 的参数要求了。案例:表 6-7 数据准备 movie category 字段名字《疑犯追踪》 悬疑,动作,科幻,剧情 《Lie to me》 悬疑,警匪,动作,心理,剧情 《战狼 2》 战争,动作,灾难生成的效果《疑犯追踪》 悬疑 《疑犯追踪》 动作 《疑犯追踪》 科幻 《疑犯追踪》 剧情 《Lie to me》 悬疑 《Lie to me》 警匪 《Lie to me》 动作 《Lie to me》 心理 《Lie to me》 剧情 《战狼 2》 战争 《战狼 2》 动作 《战狼 2》 灾难根据上面的分析,我们可以很快的把 category 字段给转成行,但是不能直接 select 出来,因为左边 movie 只有三行,但是右边的数据有 12 行,行数都不一致了,肯定不行的。SELECT movie, category_name FROM movie_info lateral VIEW explode(split(category,",")) movie_info_tmp AS category_name;看需求:是否要跟源表的字段做关联,如果要关联,就需要这个写法了。时间相关函数current_timestampfrom_unixtimefrom_utc_timestampto_unix_timestampto_utc_timestampunix_timestampcurrent_timestamp返回当前时间。格式是时间类型,准确到秒。select current_timestamp; # 2022-03-27 04:10:01.382from_unixtime把时间戳类型的时间转变成时间类型的时间,但是与北京时间缺了8小时。其中它可以指点输出的格式。SELECT from_unixtime(1648323079, 'yyyy-MM-dd HH:mm:ss'); # 2022-03-26 19:31:19from_utc_timestamp上面这个转出来的时间是慢了8小时的,这一个函数就是为了解决这个问题的。参数必须要求是 时间类型的时间,所以需要转一下。后者是指定时区。GMT+8 == PRC 。注意大写select from_utc_timestamp(from_unixtime(1648323079),'GMT+8'); # 2022-03-27 03:31:19to_unix_timestamp把时间转成时间戳的形式,但是这个时间戳也是有8小时时差的问题的。select to_unix_timestamp('2022-03-27 03:31:19'); # 1648351879 ----》 2022-03-27 11:31:19转成时间戳的类型,但是再把这个时间戳转回到时间类型,他就会多8小时了。to_utc_timestamp返回当前正确的北京时间。select to_utc_timestamp(current_timestamp,'RPC'); # 2022-03-27 04:11:18.321unix_timestamp返回时间戳。select unix_timestamp(); # 1648325494 # 提示被抛弃了,使用 current_timestamp 代替时间戳unix_timestamp 和 to_unix_timestamp 都是返回时间戳类型的函数。一个是生成,一个是转成。正常时间除了上面的这两个,其他的都是了。。不想打了时间函数to_date:抽取日期部分select to_date('2020-10-28 12:12:12');year:获取年select year('2020-10-28 12:12:12');month:获取月select month('2020-10-28 12:12:12');day:获取日select day('2020-10-28 12:12:12');hour:获取时select hour('2020-10-28 12:12:12');minute:获取分select minute('2020-10-28 12:12:12');second:获取秒select second('2020-10-28 12:12:12');weekofyear:当前时间是一年中的第几周select weekofyear('2020-10-28 12:12:12');dayofmonth:当前时间是一个月中的第几天select dayofmonth('2020-10-28 12:12:12');months_between: 两个日期间的月份select months_between('2020-04-01','2020-10-28');add_months:日期加减月select add_months('2020-10-28',-3);datediff:两个日期相差的天数select datediff('2020-11-04','2020-10-28');date_add:日期加天数select date_add('2020-10-28',4);date_sub:日期减天数select date_sub('2020-10-28',-4);last_day:日期的当月的最后一天select last_day('2020-02-30');date_format(): 格式化日期select date_format('2020-10-28 12:12:12','yyyy/MM/dd HH:mm:ss');
2022年04月14日
3 阅读
0 评论
0 点赞
1
2
3