作者:三十二号t娶我吧 | 来源:互联网 | 2023-07-04 10:19
笔者总结下Sqoop初学习过程中的一些经验,与大家分享和讨论下。首先,在网上找了些零碎的资料了解皮毛后,直接参阅官方的文档地址http:archive.cloudera.comcdh3sqo
笔者总结下Sqoop初学习过程中的一些经验,与大家分享和讨论下。首先,在网上找了些零碎的资料了解皮毛后,直接参阅官方的文档地址
http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html
。然后,通过manual文件来获取更多的信息,命令如下代码所示。最后,在网上搜索到一些实例,但是这些实例不一定适合我的工作环境,所以需要测试和修改,得到适合自己的环境的命令。
[Bash shell] 纯文本查看 ?
123 |
$sqoop help $sqoop
import --help
$sqoop
export --help
|
笔者的应用环境是DB2数据和Hive数据之间传数据。大家用sqoop会比较关心两个选项import、export,本文主要总结这两个选项。考虑Hive数据库中的表的类型可以是不带分区和带分区,在import数据到Hive的时候会有所不一样,总结的内容也分块叙述。命令中的一些参数选项,可以写入到一个options file,这样可以规范管理和增加命令的复用率,但是本文为了展示直观,直接将命令全部写一起。
一、从DB2导入Hive数据库
1. Hive上无分区表
对于没有分区的表,可以直接将DB2数据导入到Hive库的表中,无需指定partition,是最简单的,命令如下:
[Bash shell] 纯文本查看 ?
1234 |
$sqoop
import --hive-
import --connect jdbc:db2:
//10 .000.000.000:60000 /DB_NAME --username username --password password \
--outdir
/home/ocdc/bin/app/sqoop_ouput_files --table DB2_TABNAME --hive-table HIVE_TABNAME -m 1 --target-
dir '/TODB2_PATH/' \ --fields-terminated-by
"\t" --lines-terminated-by
"\n" --delete-target-
dir --null-string
'' --null-non-string
'' \
-- --default-character- set =utf-8 |
2. Hive上单个分区表
对于Hive库中有分区,而分区是单个分区的,需要用--hive-partition-key KEY --hive-partition-value KEY_VALUE两个命令组合,命令如下(没有找到合适表的测试),所以这个仅供参考。
[Bash shell] 纯文本查看 ?
123 |
$sqoop
import --hive-
import --connect jdbc:db2:
//10 .000.000.000:60000 /DB_NAME --username username --password password --outdir
/home/ocdc/bin/app/sqoop_ouput_files \
--table DB2_TABNAME --hive-table HIVE_TABNAME -m 1 --target- dir '/TODB2_PATH/DB2_TABNAME/' --fields-terminated-by "\t" --lines-terminated-by
"\n" \
--hive-partition-key KEY --hive-partition-value KEY_VALUE --delete-target- dir --null-string
'' --null-non-string
'' -- --default-character-
set =utf-8 |
3. Hive上多个分区表
由于--hive-partition-key KEY --hive-partition-value KEY_VALUE不支持传入多个分区键,至少笔者搜索和测试的结果显示是如此。所以,多分区的表只能绕弯的入到Hive库中,这里提供的一个建议方法是:
[Bash shell] 纯文本查看 ?
01020304050607080910 |
$hive -e "alter table HIVE_TABNAME add partition (month_id='201410',day_id='20141007',hour_id='2014100700');" $sqoop
import --connect jdbc:db2:
//10 .000.000.000:60000 /DB_NAME --username username --password password -m 1 --outdir
/home/ocdc/bin/app/sqoop_ouput_files \
$--table DB2_TABNAME --target- dir "/TODB2_PATH" --fields-terminated-by '\t' --null-string
'' --null-non-string
'' --delete-target-
dir \
$-- --default-character- set =utf-8 $hive -e "set mapred.job.ocdc.priority=100;load data inpath '/TODB2_PATH/part-m-00000' overwrite into table HIVE_TABNAME partition (month_id=${MONTH_ID},day_id=${DAY_ID}, hour_id=${DAY_ID}${HOUR_ID});" |
二、从Hive库导入DB2库
先将Hive数据库内的表,导出到HDFS上。其实这里笔者困惑于两者同在HDFS上,区别在哪里,可能跟Hive的普通表、外部表、分区表这个概念有一定的类似理解方式吧。再用sqoop工具导入到DB2数据库,这里,笔者暂时没有测试通过,是否可以用Hive实体表的存放位置做--export-dir的参数,后续测试一下。下面给出一个建议方法:
[Bash shell] 纯文本查看 ?
1234 |
$hive -e "insert overwrite directory '/TODB2_PATH/${OP_TIME}${TAB_NAME}/' select * from ${TAB_NAME} where month_id=${OP_TIME}" $sqoop
export --connect jdbc:db2:
//10 .000.000.000:60000 /DB_NAME --username username --password password \
$--outdir
/home/ocdc/bin/app/sqoop_ouput_files --table ${DST_SCHEMA}.${TMP_TAB_NAME} \
$-- export - dir "/TODB2_PATH/${OP_TIME}${TAB_NAME}/000000_0" --input-null-string '' --input-null-non-string
'' |
三、options file的使用方法
将繁琐的命令进行规范化,并添加相应的注释,这就是options file来做的事情。举一个简单的例子:
[Bash shell] 纯文本查看 ?
0102030405060708091011121314151617181920212223242526272829303132 |
export --connect jdbc:db2: //10 .000.000.000:60000 /DB_NAME --username username --password password --outdir /home/ocdc/bin/app/sqoop_ouput_files --fields-terminated-by "\0001" --lines-terminated-by "\n" |