本文主要是介绍hive数据新旧平台迁移,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景:年前就已经规划好了,今年要将所有的数据接入一个大的平台,新平台搭建好,将旧平台的数据迁移过去即可。此时轮到本小组将自己的旧平台数据迁移到新平台中。注:旧平台5.12,新平台6.1.1。
自己遇到的问题并解决。
1.脚本中文传参不行,会出现乱码,这个其实没根本解决。最后是将这些品类 自定义标准码 利用数字或英文来代替,在脚本中做一个if判断,变量接收传进入的。有的直接不能导出全乱码,思路是先用unicode 先将中文转成英文字符,传到另外的存储后再解码就好了。
2.由于新平台权限管制很严。有些数据得到的很耗时不可能能重新跑,导出文件再上传到新平台。导出时下载有限制最多只能10w。解决方法:
1.HIVE导出超过10万的数据.
set hive.exec.compress.output=false;
insert overwrite directory ‘/user/data_ware/tmp/CSQ’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
select * from TABLE
3.新平台只有自己的账号下有权限。其他目录创建不了文件夹。将2中的文件上传到自己的目录下,impala或hive中创建外部表
create external table if not exists uinteg_dw.map_jwd_test(id string ,detail_address string , lng string , lat string )
row format delimited fields terminated by ‘\t’
stored as textfile
location ‘/user/uintegrate/jwd’;
注意:这个row format delimited fields terminated by '\t’要与导出的规则一致。要不然创建了也改看不到数据。
再创建内部表 将外部表中数据倒入即可:
create table if not exists uinteg_dw.map_jwd as
select * from uinteg_dw.map_jwd_test
注意:问题外部表和内部表结构要一致。
4.hive中数据同步到Elasticsearch 之前用jdbc连,需要引用外部jar add jar xxxxx,报错权限不足。这种方式不行,改为hive -e来进行连。
5.将分区表中每日增量数据导出半年的数据。 导出时建分区表,会多加要分区的字段。就用循环方式而且还通用。缺点是一个循环就是一个mr很耗资源。
#!/bin/sh
********************************************************************************
程序名称: P_EXP_ALL_TEMPLATE_STATDATE
功能描述: 4.1.1 数据导出-日增量-统计日
输入参数: p_in_time_str,p_in_time_end
输入资源: hadoop.T_XXXX
输出资源: mysql.T_XXXX
中间资源:
创建人员: CSQ
创建日期:
版本说明:
修改人员:
修改日期:
修改原因:
版本说明:
********************************************************************************
程序逻辑
1. 依据输入参数(数据源,开始日期,结束日期),将hadoop平台的报表导入到mysql对应表去
********************************************************************************
#引用公共参数,获取下游数据库权限赋值
source P_PARAMETER_EXP_DB_MYSQL_TEST.sh
source P_PARAMETER_SHARE.sh
export HADOOP_USER_NAME=uintegrate
vc_tablename=$1
ve_tablename=$2
if [ KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ -eq 2 ]; the…p_in_time_str
elif [ $# -eq 3 ];
then
p_in_time_str=$3
p_in_time_end=$3
elif [ $# -eq 4 ];
then
p_in_time_str=$3
p_in_time_end=$4
else
p_in_time_str=‘1901-01-01 00:00:00’
p_in_time_end=‘1901-01-01 00:00:00’
fi
vi_stat_st=date -d $p_in_time_str +%Y-%m-%d
vi_stat_ed=date -d $p_in_time_end +%Y-%m-%d
#获取链接信息,里面包含 ip,端口,用户,密码,数据库
dblist=${VC_DBLIST}
dbhost=echo "${dblist}" |awk -F, '{print $1}'
dbport=echo "${dblist}" |awk -F, '{print $2}'
dbuser=echo "${dblist}" |awk -F, '{print $3}'
dbpw=echo "${dblist}" |awk -F, '{print $4}'
dbname=echo "${dblist}" |awk -F, '{print $5}'
echo “ p i n t i m e s t r " , " p_in_time_str"," pintimestr","p_in_time_end”,“ v i s t a t s t " , " vi_stat_st"," vistatst","vi_stat_ed”
while [[ $vi_stat_st < date -d "+1 day $vi_stat_ed" +%Y-%m-%d
]]
do
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: …/uinteg_ods.db/vc_tablename/createtime=$vi_stat_st
if [ ? − e q 0 ] ; t h e n s q o o p e x p o r t − − c o n n e c t " j d b c : m y s q l : / / ? -eq 0 ]; then sqoop export --connect "jdbc:mysql:// ?−eq0];thensqoopexport−−connect"jdbc:mysql://{dbhost}: d b p o r t / {dbport}/ dbport/{dbname}?useUnicode=true&characterEncoding=utf-8" --username ${dbuser} --password ${dbpw} --table v e t a b l e n a m e − − e x p o r t − d i r / u s e r / h i v e / w a r e h o u s e / u i n t e g o d s . d b / {ve_tablename} --export-dir /user/hive/warehouse/uinteg_ods.db/ vetablename−−export−dir/user/hive/warehouse/uintegods.db/vc_tablename/createtime=KaTeX parse error: Expected 'EOF', got '\0' at position 42: …terminated-by '\̲0̲01' --input-nul…vc_tablename/createtime=$vi_stat_st exists’
fi
}&&
{
vi_stat_st=date -d "+1 day $vi_stat_st" +%Y-%m-%d
}
done
做完后思考其实还可以用另一种方式:加就加分区,半年的整合成一张表,导出文件,上传到新平台,建一个外部表,再用3不过*不能用了,选择要的字段。
其他的还在继续。
这篇关于hive数据新旧平台迁移的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!