我使用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文件中,它仅显示年龄。 有谁知道如何解决它? 感谢
答案 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
参数,并查看错误是否已解决。