补充:使用sqoop导入导出hive数据到sqlserver只需要将sqljdbc4-4.jar包放到sqoop lib目录下即可,jar包可以在网上下载,或者去https://download.youkuaiyun.com/download/xinguopeng/12445475 下载
一、数据导出Hive
1、部分字段导出,指定表目录
sqoop export --connect ‘jdbc:sqlserver://localhost:1433;username=sa;password=1;database=test_db’ --table t_test --columns “city_code,city_name,total_times,dt” --export-dir /home/hadoop/hive_date/warehouse/db_test.db/t_test/dt=2020 --input-fields-terminated-by ‘\001’;
注意:
–columns指定的是sqlserver中表的字段,顺序要和hive表中字段顺序对应上;
–input-fields-terminated-by ‘\001’ 指定hive字段分隔符
二、数据导入Hive
1、把数据导入到hdfs
sqoop import --connect ‘jdbc:sqlserver://192.168.10.22:1433;username=sa;password=1;database=test_db’ --query “select city_code,city_name,total_times,dt,cast(sjc as bigint) as sjc_n from t_test where $CONDITIONS” --target-dir /home/hadoop/hive_date/data_test/t_test -m 1 --split-by ‘1’ --fields-terminated-by ‘\001’ --hive-drop-import-delims
把数据导入到Hive
load data inpath ‘/home/hadoop/hive_date/data_test/t_test/*’ into table t_test partition(dt=‘2020’);
注意:
–fields-terminated-by ‘\001’ 指定存到hdfs上的分隔符
–hive-drop-import-delims 删除数据中换行符避免数据串行
sjc 字段为sqlserver中的时间戳字段,转成int类型后插入hive
-m 设置map数量
–split-by 如果表中有唯一主键列,可以直接指定此列为拆分map的依据,如果只设置1个map,那么直接给一个固定值即可。如-m设置为2,主键id列为1–100的100条数据,那么会直接拆为1-50和51-100的两个map进行导数据
2、指定sql条件oracle数据导入hive
sqoop import --hive-import --connect jdbc:oracle:thin:@localhost:1521:gbxm --username mzl_test --password lian123 --table TEST_0605 -m 1 --columns “SJC,NAME,JGBM” --where “hive_seq >= 1” --hive-table db_test.ETL_TEST_0605 --hive-drop-import-delims --hive-overwrite --hive-partition-key dt --hive-partition-value 20200615 --null-non-string ‘\N’ --null-string ‘\N’ --delete-target-dir
–columns 指定导入的列名,必须大写
–hive-import 必须加,数据先导入临时目录然后才会导入hive表和分区
–delete-target-dir 如果临时目录在hdfs文件已经有了则先删除
–where 指定sql条件
–hive-partition-key 指定hive分区字段
–hive-partition-value 指定分区值
三、sqoop的eval工具
在使用sqoop导出hive数据到sqlserver之前,可以先清空sqlserver表中的数据
sqoop eval --connect jdbc:mysql://localhost:3306/test --username sa --password 1 --query “truncate table t_test”