sqoop导入查询仅导入第一列

时间:2015-07-20 09:19:23

标签: mysql hadoop sqoop

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

这是你的命令。

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文件中,它仅显示年龄。 有谁知道如何解决它? 感谢

3 个答案:

答案 0 :(得分:1)

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

Sqoop还可以导入任意SQL查询的结果集。您可以使用--query参数指定SQL语句,而不是使用--table, - column和--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 :(得分: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 

答案 2 :(得分:0)

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

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