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