我有一个配置单元查询:
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
答案 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'作为分隔符。