MONGO数据同步到HIVE分区表实现增量同步

一:创建中间表,此中间表路径为步骤二中mongo数据json文件上传路径,表字段只建一个,数据会在步骤二中上传进来一个json文件,数据为json类型的字符串。一条数据中可有多个字段如(_id,reqid,auditTime,values),但在此处只创建一个字段即可。下文中解释。。。

CREATE TABLE `tmp_mongo_test.tmp_table_test`(
      `json_data` string)
      ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001';

 

二: 使用mongoexport导出数据的本地路径,可编写shell脚本,进行传参提高通用性,脚本可优化报错逻辑等,此处只写导出数据,注意考本数据到大数据步骤中mongo时间格式,根据实际情况二选一即可

#!/bin/bash

#传参用

db_name=$1
table_name=$2
ip=$3
pk_col=$4

#转换大小写

declare -l folder_name1=$1
declare -l folder_name2=$2

#hdfs目录
mypath=/user/hive/warehouse/tmp_mongo_${folder_name1}.db/tmp_${folder_name2}
#mypath=/scripts/mongo/${folder_name1}/${folder_name2}

#数据的起止时间
start_dt=`date +%Y-%m-%d -d'-1 day'`
end_dt=`date +%Y-%m-%d`
file_time=`date +%Y%m%d -d'-1 day'`
db_end=`date +%Y%m`

#数据库后缀时间
yearMonth=`date -d "0 month ago" +%Y%m`

#拷贝数据到hdfs本地 普通时间格式  
/usr/bin/mongoexport -h ${ip} -d ${db_name}_${yearMonth} -c ${table_name}  -q "{'${pk_col}':{\"\$gte\":'${start_dt} 00:00:00.000Z',\"\$lt\":'${end_dt} 00:00:00.000Z'}}" -o /tmp/${table_name}_${file_time}.json

#拷贝数据到hdfs本地 ISODate时间格式 

/usr/bin/mongoexport -h ${ip} -d ${db_name}_${yearMonth} -c ${table_name}  -q "{'createdAt':{\"\$gte\":ISODate('${start_dt}:00:00.000Z'),\"\$lt\":ISODate('${end_dt}:00:00.000Z')}}" -o /tmp/${table_name}_${file_time}.json


#大数据上传文件yarn用户认证
#kinit -kt /opt/yarn.keytab yarn

#上传数据到hdfs指定目录
hadoop fs -put  /tmp/${table_name}''_${file_time}.json ${mypath}/

#删除本地文件
rm -f /tmp/${table_name}''_${file_time}.json

 

三:创建hive分区表,如字段中有时间属性,可以用时间做分区,其他也可,此处以时间为分区举例。

CREATE TABLE `mongo_test.table_test`(
        `id` string,
      `reqid` string, 
      `auditTime` string, 
      `values_str` string   ------------------ 此处对应mongo中values字段,因为values为hive关键字
    PARTITIONED BY ( 
      `pk_year` string, 
      `pk_month` string, 
      `pk_day` string)
      ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' 
STORED AS RCFILE;

 

四:解析字段插入到hive分区表中。此处json_data为步骤一中创建中间表字段。

INSERT overwrite TABLE mongo_test.table_test partition (pk_year,pk_month,pk_day)

SELECT get_json_object(a.json_data,'$._id') AS id,

get_json_object(a.json_data,'$.reqId') AS reqId,

get_json_object(a.json_data,'$.auditTime') AS auditTime,

get_json_object(a.json_data,'$.values') AS values_str,                         -----------------此处映射可自定义hive字段名

substring(get_json_object(a.json_data,'$.auditTime'),1,4) AS pk_year,    ---------------此处切割·auditTime·字段为分区字段

substring(get_json_object(a.json_data,'$.auditTime'),1,7) AS pk_month,

substring(get_json_object(a.json_data,'$.auditTime'),1,10) AS pk_day

FROM tmp_mongo_test.tmp_table_test a

 

总结:至此,通过mongoexport同步mongo数据到hive分区表就完成了,上步骤二脚本中可通过变量及传参配合调度系统做到增量同步。

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值