9

我们正在使用 Cloudera CDH 4,并且能够按预期将表从我们的 Oracle 数据库导入我们的 HDFS 仓库。问题是我们的数据库中有成千上万的表,而 sqoop 一次只支持导入一个表。

哪些选项可用于将多个表导入 HDFS 或 Hive?例如,一次将 200 个表从 oracle 导入 HDFS 或 Hive 的最佳方法是什么?

到目前为止,我看到的唯一解决方案是为每个表导入创建一个 sqoop 作业,然后单独运行它们。由于 Hadoop 旨在处理大型数据集,因此似乎应该有更好的方法。

4

7 回答 7

7

您可以使用“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'
于 2014-05-21T05:28:42.563 回答
4
  1. Assuming that the sqoop configuration for each table is the same, you can list all the tables you need to import and then iterate over them launching sqoop jobs (ideally launch them asynchronously). You can run the following to fetch the list of tables from Oracle: SELECT owner, table_name FROM dba_tables reference

  2. Sqoop does offer an option to import all tables. Check this link. There are some limitations though.

  3. Modify sqoop source code and recompile it to your needs. The sqoop codebase is well documented and nicely arranged.

于 2013-06-19T18:50:01.870 回答
3

使用 import-all-tables 时 --target-dir 不是有效选项。

要导入特定目录中的所有表,请使用--warehouse-dir而不是 --target-dir。

例子:

$ sqoop import-all-tables --connect jdbc:mysql://localhost/movies --username root --password xxxxx --warehouse-dir '/user/cloudera/sqoop/allMoviesTables' -m 1

于 2018-01-16T18:42:10.107 回答
2

最好的选择是做我的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
于 2016-06-06T04:21:39.127 回答
1

您可能可以导入多个表:http ://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_literal_sqoop_import_all_tables_literal

于 2013-06-19T18:54:17.510 回答
0

您可以使用 Sqoop " import-all-tables" 功能导入数据库中的所有表。这还有另一个参数 ,--exclude-tables您可以使用它来排除一些您不想在数据库中导入的表。

注意:--exclude-tables仅适用于 import-all-tables 命令。

于 2016-11-25T12:21:22.907 回答
0

如果没有表非常少,则通过 sqoop 导入多个表。为每个表创建 sqoop 导入,如下所示。

  • sqoop import --connect jdbc:mysql://localhost/XXXX --username XXXX
    password=XXXX
    --table XXTABLE_1XX*
  • sqoop import --connect jdbc:mysql://localhost/XXXX --username XXXX
    password=XXXX
    --table XXTABLE_2XX*

等等。

但是,如果没有表是 100 或 1000 甚至更多怎么办。下面将是理想的解决方案。

在这种情况下,准备从包含要导入的表名列表的文本文件中获取输入的 shell 脚本,迭代,为每个表运行 scoop 导入作业

于 2021-07-05T06:40:48.707 回答