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码输入的介绍。。。