Почему sqoop терпит неудачу в NumberFormatException для числового столбца во время экспорта из улья в mysql

У меня есть простой запрос улья

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);

Наконец, я хочу экспортировать данные из hdfs в mysql с помощью sqoop.

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

person Julias    schedule 02.06.2013    source источник


Ответы (1)


Вам нужно создать таблицу MySQL с BIGINT, потому что некоторые из ваших выходных данных, например 100322836692, слишком велики, чтобы поместиться в целое число (от -2147483648 до 2147483648), поэтому, когда Sqoop попытается импортировать, он посмотрит на схему и обнаружит, что вы Ожидаете целое число, пытаетесь проанализировать целое число, а затем терпите неудачу, потому что оно слишком велико.

Это ожидается при работе с большими суммами в Hive, когда вы делаете COUNT или SUM. Я много раз видел эту ошибку, которая не всегда очень явная.

Это должно исправить это:

create table hive_table(fl bigint, evs bigint);
person Charles Menguy    schedule 02.06.2013