10

我有一个蜂巢查询:

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部分没有按预期工作?

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

堆栈跟踪:

 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

4 回答 4

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

于 2013-11-03T22:16:10.017 回答
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'
于 2015-03-01T23:53:28.577 回答
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^A0.0^A0.0

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

所以最好在引号('0x01')或

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

于 2013-09-28T16:27:10.183 回答
0

我认为它的 DataType 与您的 RDBMS 模式不匹配。

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

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

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

于 2013-09-28T13:50:04.443 回答