2015-07-20 90 views
1

我使用sqoop将数据从mysql导入到以csv格式的hadoop中,使用table参数时效果很好。但是,当我使用查询参数时,它只能导入第一列,其他列都会丢失。sqoop导入查询只导入第一列

在这里你是我的命令。

sqoop import \ 
--connect jdbc:mysql://127.0.0.1:3306/sqoop \ 
--username root \ 
--password root \ 
--query ' select age, job from person where $CONDITIONS ' \ 
--bindir /tmp/sqoop-hduser/compile \ 
--fields-terminated-by ',' \ 
--target-dir /Users/hduser/hadoop_data/onedaydata -m1 

在csv文件中,它只显示年龄。 有谁知道如何解决它? 谢谢

+0

我会添加更多关于您的案例的细节(数据库DDL,数据,Sqoop版本,...) –

回答

0

无论何时您使用--query参数,您需要指定--split-by参数以及应用于将数据分片为多个并行任务的列。另一个必需参数是--target-dir,它指定HDFS上应该存储数据的目录。

解决方案:尝试在您的sqoop命令中包含--split-by参数,并查看错误是否已解决。

1

从sqoop用户指南阅读本文档,当您使用$条件时,您必须指定拆分列。

Sqoop也可以导入任意SQL查询的结果集。您可以使用--query参数指定SQL语句,而不是使用--table,--columns和--where参数。 导入自由格式查询时,必须使用--target-dir指定目标目录。

如果要并行导入查询结果,则每个映射任务都需要执行查询的副本,结果按由Sqoop推断的边界条件进行划分。

您的查询必须包含令牌$ CONDITIONS,每个Sqoop进程将用一个唯一的条件表达式替换。您还必须使用--split-by选择拆分列。

例如:

$ sqoop import \ 
    --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \ 
    --split-by a.id --target-dir /user/foo/joinresults 

可替换地,查询可以被执行一次,并用-m 1串联进口,通过指定一个单一的映射任务:

$ sqoop import \ 
    --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \ 
    -m 1 --target-dir /user/foo/joinresults 
1

尝试这种情况:

sqoop import \ 
--connect jdbc:mysql://127.0.0.1:3306/sqoop \ 
--username root \ 
--password root \ 
**--columns "First_Column" \** 
--bindir /tmp/sqoop-hduser/compile \ 
--fields-terminated-by ',' \ 
--target-dir /Users/hduser/hadoop_data/onedaydata -m1