Hadoop 如何使用sqoop导出默认配置单元分隔的输出?
我有一个配置单元查询:Hadoop 如何使用sqoop导出默认配置单元分隔的输出?,hadoop,hive,sqoop,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' 但这似乎无法根
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
我认为这是因为数据类型与您的RDBMS模式不匹配 尝试查找“9-2”值的列名,并检查RDBMS模式中的数据类型 如果是int或numeric,那么Sqoop将解析该值并插入。看起来“9-2”不是数值
如果这不起作用,请告诉我。sqoop似乎将“0”作为分隔符。 您将收到一个错误,因为:- mysql表中的第一列可以是varchar,第二列是数字。 根据以下字符串:- 16-09-2013 sqoop解析的第一列是:-16- 第二列是:-9-2 因此最好在引号中指定分隔符('0x01') 或 (它总是很简单,并且具有更好的控制)使用配置单元创建表命令如下:-
创建以“\t”结尾的表tablename行格式分隔字段作为选择。。。并在sqoop命令中指定“\t”作为分隔符。我在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中将这个特殊字符编码到命令行的另一种可能性是使用
--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'
是--由0x01部件终止的输入字段工作不正常。您可以尝试以下操作:sqoop导出--连接jdbc:mysql://mysqlm/site --用户名站点--密码站点--表x_数据--导出目录/x--输入字段以“\001”结尾--输入空字符串“\\N”--输入空非字符串“\\N”@MukeshS分隔符“\001”对我不起作用,而“\0001”起作用。额外的“0”也可以简化^A'\001'的八进制表示。sqoop导出--连接jdbc:mysql://mysqlm/site --用户名站点--密码站点--表x_数据--导出目录/x--输入字段以“\001”结尾--行以“\n”结尾问题:您如何知道它是“\001”而不是“\01”或“\1”?我查看了手册:但没有找到任何关于如何使用ASCII码输入的介绍。。。