我们正在使用Cloudera CDH 4,我们可以按预期将Oracle数据库中的表导入我们的HDFS仓库。问题是我们的数据库中有数千个表,而sqoop一次只支持导入一个表。
有哪些选项可用于将多个表导入HDFS或Hive?例如,将oracle中的200个表一次导入HDFS或Hive的最佳方法是什么?
到目前为止,我看到的唯一解决方案是为每个表导入创建一个sqoop作业,然后单独运行它们。由于Hadoop设计用于处理大型数据集,因此似乎应该有更好的方法。
答案 0 :(得分:4)
答案 1 :(得分:4)
U可以使用“import-all-tables”选项一次将所有表加载到HDFS中。
sqoop import-all-tables --connect jdbc:mysql://localhost/sqoop --username root --password hadoop --target-dir '/Sqoop21/AllTables'
如果我们要排除一些要加载到hdfs的表,我们可以使用“--exclude-tables”选项
例如:
sqoop import-all-tables --connect jdbc:mysql://localhost/sqoop --username root --password hadoop --target-dir '/Sqoop21/AllTables' --exclude-tables <table1>,<tables2>
如果我们想要存储在指定的目录中,那么你可以使用“--warehouse-dir”选项
例如:
sqoop import-all-tables --connect jdbc:mysql://localhost/sqoop --username root --password hadoop --warehouse-dir '/Sqoop'
答案 2 :(得分:2)
- 使用import-all-tables时,target-dir不是有效选项。
要导入特定目录中的所有表格,请使用 - warehouse-dir 而不是--target-dir。
示例:强>
$ sqoop import-all-tables --connect jdbc:mysql:// localhost / movies --username root --password xxxxx --warehouse-dir&#39; / user / cloudera / sqoop / allMoviesTables&#39; -m 1
答案 3 :(得分:1)
您可以导入多个表格:http://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_literal_sqoop_import_all_tables_literal
答案 4 :(得分:1)
最好的选择是做我的shell脚本
准备一个包含DBNAME.TABLENAME列表的输入文件2)shell脚本将此文件作为输入,逐行迭代并为每一行执行sqoop语句。
while read line;
do
DBNAME=`echo $line | cut -d'.' -f1`
tableName=`echo $line | cut -d'.' -f2`
sqoop import -Dmapreduce.job.queuename=$QUEUE_NAME --connect '$JDBC_URL;databaseName=$DBNAME;username=$USERNAME;password=$PASSWORD' --table $tableName --target-dir $DATA_COLLECTOR/$tableName --fields-terminated-by '\001' -m 1
done<inputFile
答案 5 :(得分:0)
您可以使用Sqoop&#34; import-all-tables
&#34;功能导入数据库中的所有表。这还有另一个参数--exclude-tables
,您可以在其中排除一些您不想在数据库中导入的表格。
注意:--exclude-tables
仅适用于import-all-tables命令。
答案 6 :(得分:0)
如果表的数量非常少,则通过 sqoop 导入多个表。 为每个表创建 sqoop 导入,如下所示。
等等。
但是如果没有表是 100 或 1000 甚至更多呢?以下将是理想的解决方案。
在这种情况下,准备从包含要导入的表名列表的文本文件中获取输入的 shell 脚本,迭代,为每个表运行 scoop 导入作业