创建function实现hive表结果导出到mysql

1. 创建临时function (这里两个包都是hive自带的,不需要自己开发的,可以根据名称查找对应的版本)

add jar /opt/local/hive/lib/hive-contrib-2.3.3.jar;
add jar /opt/local/hive/lib/mysql-connector-java-5.1.35-bin.jar;

CREATE TEMPORARY FUNCTION dboutput AS 'org.apache.hadoop.hive.contrib.genericudf.example.GenericUDFDBOutput';

 

2. dboutput使用方法

select dboutput(jdbc数据库链接,  用户名, 密码, sql语句, hive字段值) from hive表

准备一张hive表记录如下,然后在mysql中创建相同字段的表.

根据上面到规则,完整的hive脚本如下, 保存到script.q文件中:

--定义临时function,用于导出到mysql
add jar /opt/local/hive/lib/hive-contrib-2.3.3.jar;
add jar /opt/local/hive/lib/mysql-connector-java-5.1.35-bin.jar;
CREATE TEMPORARY FUNCTION dboutput AS 'org.apache.hadoop.hive.contrib.genericudf.example.GenericUDFDBOutput';

--查询hive并将结果写入mysql
select dboutput('${url}','${username}','${password}',
'INSERT INTO dm_index_pv_uv
(dt,tenantcode,deviceid,bourse_week,week_begin,week_end, yrmm, month_begin, month_end) 
VALUES(?,?,?,?,?,?,?,?,?)',
dt,tenantcode,deviceid,bourse_week,week_begin,week_end, yrmm, month_begin, month_end
)from dw_stg.tmp_1 where dt=${dt};

这里只能insert into记录,无法删除。下面这种写法是错误的

select dboutput('${url}','${username}','${password}',
'delete from dm_index_pv_uv where dt=${dt};##这行错误!!
INSERT INTO dm_index_pv_uv
(dt,tenantcode,deviceid,bourse_week,week_begin,week_end, yrmm, month_begin, month_end) 
VALUES(?,?,?,?,?,?,?,?,?)',
dt,tenantcode,deviceid,bourse_week,week_begin,week_end, yrmm, month_begin, month_end
)from dw_stg.tmp_1 where dt=${dt};

 

 

使用hive -f脚本执行。

#!/bin/sh
echo 'app2mysql'

hive -f script.q \
-hivevar dt=20181201 \
-hivevar url=jdbc:mysql://dwdev-name2/bigdata \
-hivevar username=mysql \
-hivevar password=123456

 

执行过程如下:

查看mysql 中记录:

 

一般数据量不大的情况下,可以直接使用,还是比较方便的。省去了使用sqoop或者自己开发的麻烦。

 

posted @ 2018-12-11 13:22  硅谷工具人  阅读(567)  评论(0编辑  收藏  举报
成功之道,在于每个人生阶段都要有不同的目标,并且通过努力实现自己的目标,毕竟人生不过百年! 所有奋斗的意义在于为个人目标实现和提升家庭幸福,同时能推进社会进步和国家目标! 正如古人讲的正心诚意格物致知,修身齐家治国平天下。