创建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或者自己开发的麻烦。

原文地址:https://www.cnblogs.com/30go/p/10101607.html