由于sqoop将mysql数据导入到Hive分区表时,其命令只支持只有一个分区的hive表,多个分区没有命令直接可用。所以只能采用迂回的方式来实现导入多分区的Hive表。
1)建立Hive多分区表(外部表)
CREATE EXTERNAL TABLE IF NOT EXISTS import.zbd_t_product_comparison (
gcjt_syb_desc STRING COMMENT '产品线',
brand STRING COMMENT '品牌',
year STRING COMMENT '年份',
month STRING COMMENT '月份',
machine_sets BIGINT COMMENT '台份',
money DECIMAL(28,12) COMMENT '金额'
)PARTITIONED BY (
plantype STRING COMMENT '类别:year/month,区分分区为年还是年月的分区',
planvalue STRING COMMENT '类别如果为year:yyyy, 如果类别为month:yyyyMM'
)COMMENT '产品对比表'
row format delimited fields terminated by '\t'
stored as textfile
LOCATION '/etl/rfc/pull/crm/sqoop_product_comparison';
2)sqoop导出Mysql数据到HDFS文件
如下命令中,只选取201802的数据,导入到HDFS文件中:
/etl/rfc/pull/crm/sqoop_product_comparison/plantype=month/planvalue=201802
其中,plantype=month分区,planvalue为201802分区,
命令如下:
sqoop import --connect jdbc:mysql://10.39.52.58:3306/app_data \
--username root \
--password root2017 \
--fields-terminated-by '\t' \
--m 1 \
--query "select gcjt_syb_desc,brand,year,monthmachine_sets,money from zbd_import_t_product_comparison where planvalue='201802' and \$CONDITIONS" \
--target-dir /etl/rfc/pull/crm/sqoop_product_comparison/plantype=month/planvalue=201802 \
--delete-target-dir
3)删除已存在的分区(目的是利用下面的第四步加载数据从而实现所谓的覆盖数据)
alter table import.zbd_t_product_comparison DROP IF EXISTS partition (plantype='month',planvalue='201802');
4)添加分区,将HDFS文件加载到Hive分区表中
alter table import.zbd_t_product_comparison add partition (plantype='month',planvalue='201802') location '/etl/rfc/pull/crm/sqoop_product_comparison/plantype=month/planvalue=201802';
5)如果select count(1) from import.zbd_t_product_comparison; 结果为0,则在hive shell或者Impala-shell 中输入:
refresh import.zbd_t_product_comparison; 刷新hive表再看结果。