Misc Notes

Sqoop使用笔记

CDH装完后想通过sqoop2来把数据导入hive,结果发现导数据的过程中,虽然生成了10个map,但其中9个map都是空的,导致最后生成了9个0大小的文件和一个巨大的文件,没找到原因,只在官网找到这么一句话 Note that 1.99.7 is not compatible with 1.4.6 and not feature complete, it is not intended for production deployment.

好吧,那我就不挣扎了,用Sqoop 1.4.6吧。把使用过程记录下来,以备后查:

  • 首先,去微软官网下载个sqlserver的jdbc驱动jar包,把它放在/var/lib/sqoop/下面。
  • 查看数据库
    1
    $ sqoop list-databases --connect 'jdbc:sqlserver://192.168.1.xxx;username=sa;password=xxx'
  • 导入一个库中的所有表,不过前提是这些表都有主键,按理说参数里应该有指定数据库名字的方法,我没找到,发现强行写在连接字符串里也行
    1
    $ sqoop import-all-tables --connect 'jdbc:sqlserver://192.168.1.xxx;username=sa;password=xxx;DatabaseName=XXX' --hive-import
  • 导入一个表,在这个表没有主键的情况下,可以用–split-by参数来指定,同样我也还是不知道怎么用参数来指定数据库名字
    1
    $ sqoop import --connect 'jdbc:sqlserver://192.168.1.xxx;username=sa;password=xxx;DatabaseName=XXX' --table tablename --split-by split_column --hive-import
  • 导完后发现数据比原数据库多了一半,真蛋疼,研究之后发现,原来是因为我原表中有文本字段,有不少逗号和\n,而hive默认是使用逗号来作为字段分隔符,\n来作为行分隔符,所以还是需要加上quote来保证不被切割
    1
    $ sqoop import --connect 'jdbc:sqlserver://192.168.1.xxx;username=sa;password=xxx;DatabaseName=XXX' --table tablename --split-by split_column --hive-import --fields-terminated-by , --escaped-by \\ --enclosed-by '\"'
  • 上面的方法中,所有的字段都会被加上""包括起来,其实也挺浪费空间的,使用另外一个参数 --optionally-enclosed-by '\"'来代替 --enclosed-by '\"',就会自动用引号括起需要的字段,别的字段还是原样裸的。