sqoop导入hive时间格式问题解决方案

解决SQoop从MySQL导入数据到Hive时的时间格式问题。通过使用MySQL的DATE_FORMAT函数及SQOOP的--query参数,成功调整时间格式,并在Hive表中新增日期字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sqoop导入hive时间格式问题解决方案

从mysql导入数据时,发现时间格式有问题,要么是时间后面多一位零,要么要使用时间戳,还能不能好好玩耍了?!
于是,我就逛论坛,找大神,最终无果,也许这个问题过于简单吧,居然没有大牛讨论。想了好几天,也看了sqoop官网,突然灵光一闪,我怎么不去看看mysql官网呢?于是,最终解决方案渐渐揭开了神秘的面纱~~~~~
首先,我们复习一下:

1. mysql 中日期与时间格式

时间日期格式对照表:
时间日期对照表
时间日期详情对比表:
时间日期详情

2.时间日期转换格式:

#第一种方法:
date_col = CAST(datetime_col AS DATE)
#第二种方法:
DATE_FORMAT(SYSDATE(),'%Y-%m-%d %H:%i:%s')

3.sqoop中抽取数据的两个命令:

--columns column_name1,column_name2...
--query 'select column_name1,column_name2...from table where $CONDITIONS'

用法比较:

--columns 后面跟我们需要的属性名,中间不能有空格,不然会报错。
--query 后面可以跟一个sql语句,那就自由了,随便有空格。但是使用时必需要有$CONDITIONS做为条件,没有其他条件就where $CONDITIONS,有其他条件就用AND连接放在最后面。
另外要说明的是,query后面支持双引号和单引号,效果相同,但如果是双引号,where $CONDITIONS会报错,需要在$前加转义字符“\”,即where \$CONDITIONS;

两都比较,我们会发现,如果要转换格式,我们避免不了空格,而且我的需求还是在导入的hive表中添加mysql表中不存在的日期字段。所以只能用--query命令。

4.编辑代码:

sqoop import --hive-import \
--connect jdbc:mysql://xxx.xxx.x.x:3306/pinyougoudb \
--username root \
--password root \
--hive-table tb_name\
--query "SELECT ID,NAME,FIRST_CHAR,DATE_FORMAT(SYSDATE(),'%Y-%m-%d %H:%i:%s') AS CREATION_TIME FROM TB_BRAND WHERE \$CONDITIONS" \
--delete-target-dir \
--target-dir /export/data/sv/bas/tb_brand \
--null-string '' \
--null-non-string ''\
 --fields-terminated-by '\001' \
 -m 1;

5.查看表格数据如下:

hive> select * from tb_name;
OK
1	联想	L	2019-07-17 00:24:32
2	华为	H	2019-07-17 00:24:32
3	三星	S	2019-07-17 00:24:32
4	小米	X	2019-07-17 00:24:32
5	OPPO	O	2019-07-17 00:24:32
6	360	S	2019-07-17 00:24:32
7	中兴	Z	2019-07-17 00:24:32
8	魅族	M	2019-07-17 00:24:32
9	苹果	P	2019-07-17 00:24:32
11	诺基亚	N	2019-07-17 00:24:32
12	锤子	C	2019-07-17 00:24:32

6.时间格式转换

字符变量  	描述
%a	 工作日缩写名称(Sun.. Sat)
%b	 缩写的月份名称(Jan.. Dec)
%c	 月,数字(0.. 12)
%D	 这个月的一天,英语后缀(0th, 1st,2nd, 3rd,...)
%d	 每月的某一天,数字(00.. 31)
%e	 每月的某一天,数字(0.. 31)
%f	 微秒(000000... 999999)
%H	 小时(00.. 23)
%h	 小时(01.. 12)
%I	 小时(01.. 12)
%i	 分钟,数字(00.. 59)
%j	 一年中的一天(001.. 366)
%k 	 小时(0.. 23)
%l	 小时(1.. 12)
%M 	 月份名称(January.. December)
%m	 月,数字(00.. 12)
%p	 AM 要么 PM
%r	 时间,12小时(hh:mm:ss其次是 AM或PM)
%S	 秒(00... 59)
%s	 秒(00... 59)
%T	 时间,24小时(hh:mm:ss)
%U	 周(00.. 53),周日是一周的第一天; WEEK()模式0
%u	 周(00.. 53),周一是一周的第一天; WEEK()模式1
%V	 周(01.. 53),周日是一周的第一天; WEEK()模式2; 用于 %X
%v	 周(01.. 53),周一是一周的第一天; WEEK()模式3; 用于 %x
%W	 工作日名称(Sunday.. Saturday)
%w	 星期几(0=星期日.. 6=星期六)
%X	 星期日是星期的第一天的星期,数字,四位数; 用于%V
%x	 一周的年份,星期一是一周的第一天,数字,四位数; 用于%v
%Y	 年份,数字,四位数
%y	 年份,数字(两位数)
%%	 文字%字符
%x	 x,对于上面未列出的任何 “ x”

7.orcal时间格式转换:

TO_CHAR(CLUMNS,'yyyy-MM-dd hh24:mi:ss')
TO_CHAR(SYSDATE,'yyyy-MM-dd hh24:mi:ss')

什么?你想要时间后面跟更多或更少?好吧,压箱底儿的宝贝也给你吧:
oracle日期数据格式
如还有疑问,请留言,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值