如何使用sqoop导出默认的hive分隔输出?

时间:2013-09-24 10:05:54

标签: hadoop hive sqoop

我有一个配置单元查询:

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'

但是这似乎无法根据分隔符解析字段 我错过了什么? 我认为 - 输入字段 - 终止 - 0x01 部分无法按预期工作吗?

我不想在包含查询结果的配置单元中创建其他表。

堆栈跟踪:

 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

4 个答案:

答案 0 :(得分:11)

我在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

答案 1 :(得分:3)

使用

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

因为sqoop export命令中的标志似乎对我有用。

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

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'

答案 2 :(得分:0)

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

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

如果是int或numeric,那么Sqoop将解析值并插入。因为看起来“9-2”不是数值。

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

答案 3 :(得分:0)

似乎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.0 ^ A0.0 A0.0 ^

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

因此最好在引号中指定分隔符('0x01') 或

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