hive 数据导入mysql

下面是我将hive中数据导入到mysql中的方案,但这套方案性能速度上不是很好,想听听大家有没有更好些的方案?

目前我是在hive中有一张page_visit表,每天产生1500w数据,然后执行指定时间段内(一般三天,大概四、五千万行)的数据:

insert overwrite table archive_seller_by_geo_per_day partition(partDate, shard) select sellerTokenID, partDate archiveDate, countryCode, country, countryState, countryCity, count(*) pv, count(distinct ip) uv, partDate, shard from page_visit where partDate >= ${THREE_DAY[1]} and partDate <= ${THREE_DAY[3]} group by sellerTokenID, countryCode, country, countryState, countryCity, partDate, shard having sellerTokenID>0;

到archive_seller_by_geo_per_day中的数据有1000万行,然后通过三步将archive_seller_by_geo_per_day中数据导入到mysql中:

第一步:通过hadoop fs -get 将archive_seller_by_geo_per_day的HDFS文件导入本地
hadoop fs -get "/hive/archive_seller_by_geo_per_day/partdate=${day}/shard=${sd}/*" "${mast_get}partdate=${day}/shard=${sd}"

第二步:将本地文件load到mysql数据库 hive_archive_seller_by_geo_per_day 表(临时表)中:
${SHARDDB[$sd]} <<< "LOAD DATA LOCAL INFILE '${archive_file}' INTO TABLE hive_archive_seller_by_geo_per_day CHARACTER SET utf8 fields terminated by ',' lines terminated by '\n';"

第三步:再将hive_archive_seller_by_geo_per_day表插入和更新到mysql的正式表 archive_seller_by_geo_per_day 中:
${SHARDDB[$sd]} <<< "INSERT INTO archive_seller_by_geo_per_day (sellerTokenID, archiveDate, countryCode, country, countryState, countryCity, pv, uv) SELECT sellerTokenID, archiveDate,countryCode,country,countryState,countryCity,pv, uv from hive_archive_seller_by_geo_per_day where archiveDate=${day} ON DUPLICATE KEY UPDATE pv = VALUES(pv), uv = VALUES(uv);"

0 个评论

要回复文章请先登录注册