一:创建中间表,此中间表路径为步骤二中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分区表就完成了,上步骤二脚本中可通过变量及传参配合调度系统做到增量同步。