mysql - 为什么在从 hive 导出到 mysql 期间,sqoop 在数字列的 NumberFormatException 上失败

标签 mysql hadoop hive sqoop

我有简单的配置单元查询

INSERT OVERWRITE DIRECTORY '/tmp/test'
SELECT 
flight,
SUM(CASE WHEN ev=2 THEN 1 ELSE 0 END) AS req 
from data_table
group by flight;

输出看起来像两个数字列(在编辑器中用 ^A 分隔)。 我已经创建了 mysql 表

create table hive_table(fl int,evs int);

最后我想用sqoop将hdfs中的数据导出到mysql

sqoop export --connect jdbc:mysql://mysqlhost/dwh --username user --password password --table hive_table --export-dir /tmp/test/ --input-fields-terminated-by "\000" --lines-terminated-by '\n'

但是我收到以下错误(尽管我看到字符串是数值),并且所有导出都失败。我就是不明白为什么? 我正在使用cloudera cdh3

13/06/02 22:37:17 INFO mapred.JobClient:  map 0% reduce 0%
13/06/02 22:37:22 INFO mapred.JobClient: Task Id : attempt_201304210944_0692_m_000001_0, Status : FAILED
java.lang.NumberFormatException: For input string: "100322836692"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:458)
    at java.lang.Integer.valueOf(Integer.java:554)
    at hive_table.__loadFromFields(hive_table.java:191)
    at hive_table.parse(hive_table.java:143)
    at com.cloudera.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:81)
    at com.cloudera.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:40)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
    at com.cloudera.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:189)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:647)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformatio

最佳答案

您需要使用BIGINT创建MySQL表,因为您的一些输出(例如100322836692)太大而无法放入整数(从-2147483648到2147483648),因此当Sqoop尝试导入时它将查看架构,发现您需要一个整数,尝试解析该整数,然后由于它太大而失败。

当您在执行 COUNTSUM 时使用 Hive 处理大量数据时,这是预料之中的。我已经多次看到此错误,但并不总是非常严重。明确。

这应该可以修复它:

create table hive_table(fl bigint, evs bigint);

关于mysql - 为什么在从 hive 导出到 mysql 期间,sqoop 在数字列的 NumberFormatException 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16886668/

相关文章:

php - SELECT 语句中的 GROUP_CONCAT

php - 搜索 Laravel 后记住下拉选择选择

mysql - AWS RDS 只读副本与应用程序交互

hadoop - titan1.0.0 无法连接到 hadoop1.2.1

hadoop - 如何使用hadoop解决以下用例?

mysql - 数据库记录版本控制

hadoop - Flume - 使用 Avro Source 和 Sink 对数据流进行分层

java - Hive 无法在 hdfs 中写入数据

xml - 可以将 HCatalog 与 XML 一起使用吗? -- 在 Cloudera VM 上执行 ETL

hadoop - Hive 脚本运行时间过长