• 使用sqoop往hdfs中导入数据供hive使用


    sqoop import -fs hdfs://x.x.x.x:8020 -jt local --connect "jdbc:oracle:thin:@x.x.x.x:1521:testdb" --username user2 --password user2 --verbose --as-textfile --delete-target-dir -m 1 --query "select * from test_tb
     where $CONDITIONS" --target-dir /tmp/test --null-string '\N' --null-non-string '\N' --fields-terminated-by '01' --lines-terminated-by '12' --hive-drop-import-delims

    此语句将从oracle数据库中查出的内容放到指定的hdfs路径下,此时手动设置列换行符和行换行符,而不是使用 --hive-import 参数,是因为指定该参数之后它还会让你指定 --hive-table参数。而指定 --hive-import 和 --hive-table 之后,sqoop在将查询结果导入到hdfs中之后,会尝试调用执行sqoop的这台机器上的hive命令,然后执行建表语句以及 load data inpath 的语句将导入到hdfs中的内容移动到 hive对应的表的目录下。

    但是如果hive开启了kerberos 认证,hive命令是没有权限操作hive的(记得是这样)。所以我们用以上语句只是将数据导入到hdfs中,后续的load data inpath 可以使用beeline等命令执行。而之所以指定 --hive-drop-import-delims,是因为从oracle中查出的值中可能包含hive默认的列分隔符和行分隔符,所以只能做出妥协,使用该参数将值中的列分隔符和行分隔符直接去掉。

    列分隔符还好,列分隔符的ascii码是 001(八进制),含义是SOH(start of headline),是个不可见字符,平时文本处理时基本不会用到这个字符。但是行分隔符的ascii码是012(八进制),含义是 line feed/new line,这个在平时处理文本时会经常遇到。

    我们设想一种处理方式,那就是模仿csv文件,列分隔符就继续使用 01,行分隔符继续使用 12,如果值中有换行,就enclosed by double quote。但似乎看起来 hive的load data inpath 不支持这么高级的解析方式。关于csv的格式定义和hive的load data inpath 详细的处理方式待去查询对应的文档,此处只是提一下。

  • 相关阅读:
    windows下nginx以服务自启动
    redis数据库可视化工具(RedisDesktopManager)
    myecplise中的svn如何切换账号
    oracle创建视图包含clob字段,报错:数据类型不一致:应为-,但却获得CLOB
    java.lang.UnsatisfiedLinkError: no jacob-1.18-x64 in java.library.path
    java中关于日期的处理
    js截取字符串
    关于sql developer中表或视图不存在以及查找日志窗口
    在html页面切换标题栏目时出现页面抖动
    严重: IOException while loading persisted sessions: java.io.EOFException
  • 原文地址:https://www.cnblogs.com/vanwoos/p/8818434.html
Copyright © 2020-2023  润新知