【问题标题】:How to use sqoop to export the default hive delimited output?如何使用 sqoop 导出默认的 hive 分隔输出?
【发布时间】:2013-09-29 11:47:02
【问题描述】:

我有一个蜂巢查询:

insert override directory /x
select ...

然后我尝试用 sqoop 导出数据

sqoop export --connect jdbc:mysql://mysqlm/site --username site --password site --table x_data --export-dir /x  --input-fields-terminated-by 0x01 --lines-terminated-by '\n'

但这似乎无法根据分隔符解析字段 我错过了什么? 我认为 --input-fields-terminated-by 0x01 部分没有按预期工作?

我不想在 hive 中创建包含查询结果的其他表。

堆栈跟踪:

 2013-09-24 05:39:21,705 ERROR org.apache.sqoop.mapreduce.TextExportMapper: Exception: 
 java.lang.NumberFormatException: For input string: "9-2"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:458)
 ...

输出的vi视图

16-09-2013 23^A1182^A-1^APub_X^A21782^AIT^A1^A0^A0^A0^A0^A0.0^A0.0^A0.0
16-09-2013 23^A1182^A6975^ASoMo Audience  Corp^A2336143^AUS^A1^A1^A0^A0^A0^A0.2^A0.0^A0.0
16-09-2013 23^A1183^A-1^APub_UK, Inc.^A1564001^AGB^A1^A0^A0^A0^A0^A0.0^A0.0^A0.0
17-09-2013 00^A1120^A-1^APub_US^A911^A--^A181^A0^A0^A0^A0^A0.0^A0.0^A0.0

【问题讨论】:

  • --input-fields-terminated-by 0x01 部分工作不正常。你可以试试这个:sqoop export --connect jdbc:mysql://mysqlm/site --username site --password site --table x_data --export-dir /x --input-fields-terminated-by '\001' --input-null-string '\\N' --input-null-non-string '\\N'
  • @MukeshS 分隔符 '\001',对我不起作用,而是 '\0001' 起作用。额外的“0”起到了作用

标签: hadoop hive sqoop


【解决方案1】:

我认为它的 DataType 与您的 RDBMS 架构不匹配。

尝试查找“9-2”值的列名并检查 RDBMS 架构中的数据类型。

如果它的 int 或 numeric 然后 Sqoop 将解析该值并插入。而且看起来“9-2”不是数值。

如果这不起作用,请告诉我。

【讨论】:

    【解决方案2】:

    似乎 sqoop 将 '0' 作为分隔符。 您收到错误是因为:- mysql 表中的第一列可以是 varchar,第二列是数字。 根据以下字符串:-

    16- 0 9-2 0 13 23^A1182^A-1^APub_X^A21782^AIT^A1^A0^A0^A0^A0^A0 .0^A0.0^A0.0

    sqoop 解析的第一列是:-16- 第二列是:-9-2

    所以最好在引号中指定一个分隔符('0x01') 或

    (它总是很容易并且有更好的控制)使用 hive create table 命令作为:- 创建以 '\t' 结尾的表 tablename 行格式分隔字段作为 select ... 并在您的 sqoop 命令中指定 '\t' 作为分隔符。

    【讨论】:

      【解决方案3】:

      我在 bash 中找到了该特殊字符的正确解决方案

      #!/bin/bash
      
      # ... your script
      hive_char=$( printf "\x01" )
      
      sqoop export --connect jdbc:mysql://mysqlm/site --username site --password site --table x_data --export-dir /x  --input-fields-terminated-by ${hive_char} --lines-terminated-by '\n'
      

      问题在于正确的分隔符识别(与类型和架构无关),这是由 hive_char 实现的。

      在 linux 中将此特殊字符编码为命令行的另一种可能性是键入 Cntr+V+A

      【讨论】:

      • 您也可以简单地使用 ^A '\001' 的八进制表示。 sqoop export --connect jdbc:mysql://mysqlm/site --username site --password site --table x_data --export-dir /x --input-fields-terminated-by '\001' --lines-由 '\n' 终止
      【解决方案4】:

      使用

      --input-fields-terminated-by '\001' --lines-terminated-by '\n'
      

      sqoop 导出命令中的标志似乎对我有用。

      因此,在您的示例中,完整的命令将是:

      sqoop export --connect jdbc:mysql://mysqlm/site --username site --password site --table x_data --export-dir /x  --input-fields-terminated-by '\001' --lines-terminated-by '\n'
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2016-11-16
      • 1970-01-01
      相关资源
      最近更新 更多