使用sqoop导入,如何将行附加到现有的配置单元表中?

oknwwptz  于 2021-05-29  发布在  Hadoop
关注(0)|答案(4)|浏览(331)

我从SQLServer导入并使用下面的查询创建了一个配置单元表。

sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --table demotable --hive-import --hive-table hivedb.demotable --create-hive-table --fields-terminated-by ','

命令成功,导入了数据并创建了一个包含10000条记录的表。
我在SQLServer中插入了10条新记录,并尝试使用--where子句将这10条记录附加到现有的配置单元表中

sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --table demotable --where "ID > 10000" --hive-import -hive-table hivedb.demotable

但是sqoop作业因错误而失败
error tool.importtool:导入期间出错:导入作业失败!
我哪里出错了?使用sqoop插入到表中的任何其他替代方法。
编辑:在稍微改变上面的命令后,我可以添加新行。

sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --table demotable --where "ID > 10000" --hive-import -hive-table hivedb.demotable --fields-terminated-by ',' -m 1

虽然它解决了上述问题,但我不能插入修改过的行。有没有办法插入修改过的行而不使用--incremental lastmodified参数。

apeeds0o

apeeds0o1#

我们可以使用以下命令:

sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --query 'select * from demotable where ID > 10000' --hive-import --hive-table hivedb.demotable --target-dir demotable_data
olqngx59

olqngx592#

我不确定是否可以在sqoop中使用--hive import选项提供direct--append选项。它至少在1.4版中仍然不可用。
当缺少--hive overwrite和--create hive table时,默认行为是append(至少在这种情况下。
我同意nakulchawla09的回答。不过,提醒你自己要保留--splitby选项。这将确保适当地创建配置单元数据存储中的拆分名称。否则您将不喜欢默认命名。如果您不关心后台配置单元仓库命名和后台数据存储,可以忽略此注解。当我试着用下面的命令
追加前

beeline:hive2> select count(*) from geolocation;

+-------+--+
|  _c0  |
+-------+--+
| 8000  |
+-------+--+

在附加之前在配置单元仓库中保存文件

-rwxrwxrwx   1 root hdfs     479218 2018-10-12 11:03 /apps/hive/warehouse/geolocation/part-m-00000

用于再次附加8k记录的sqoop命令

sqoop import --connect jdbc:mysql://localhost/RAWDATA --table geolocation --username root --password hadoop --target-dir /rawdata --hive-import  --driver com.mysql.jdbc.Driver --m 1 --delete-target-dir

它创建了以下文件。您可以看到文件名不是很好,因为没有提供split-by选项或split-hash(可以是datetime或date)。

-rwxrwxrwx   1 root hdfs     479218 2018-10-12 11:03 /apps/hive/warehouse/geolocation/part-m-00000
-rwxrwxrwx   1 root hdfs     479218 2018-10-12 11:10 /apps/hive/warehouse/geolocation/part-m-00000_copy_1

Hive记录现在追加
beeline:hive2>从地理位置选择计数(*);

+-------+--+
|  _c0  |
+-------+--+
| 16000  |
+-------+--+
sgtfey8w

sgtfey8w3#

为了将行追加到配置单元表,请使用以前使用过的查询,只需删除--hive overwrite。
我将共享用于在配置单元中导入的两个查询,一个用于覆盖,一个用于附加,您可以使用相同的查询进行导入:
覆盖以前的记录

sqoop import -Dmapreduce.job.queuename=default --connect     jdbc:teradata://database_connection_string/DATABASE=database_name,TMODE=ANSI,LOGMECH=LDAP --username z******--password*******--query "select * from******where \$CONDITIONS" --split-by "HASHBUCKET(HASHROW(key to split)) MOD 4" --num-mappers 4 --hive-table hive_table_name --boundary-query "select 0, 3 from dbc.dbcinfo" --target-dir directory_name  --delete-target-dir --hive-import --hive-overwrite --driver com.teradata.jdbc.TeraDriver

附加到以前的记录

sqoop import -Dmapreduce.job.queuename=default --connect jdbc:teradata://connection_string/DATABASE=db_name,TMODE=ANSI,LOGMECH=LDAP --username******--password******--query "select * from****where \$CONDITIONS" --split-by "HASHBUCKET(HASHROW(key to split)) MOD 4" --num-mappers 4 --hive-import --hive-table guestblock.prodrptgstrgtn --boundary-query "select 0, 3 from dbc.dbcinfo" --target-dir directory_name  --delete-target-dir --driver com.teradata.jdbc.TeraDriver

注意,我使用4个Map器,你也可以使用更多。

gfttwv5a

gfttwv5a4#

使用 --append 选项和 -m 1 所以会是这样的:

sqoop import --connect 'jdbc:sqlserver://10.1.1.12;database=testdb' --username uname --password paswd --table demotable --hive-import --hive-table hivedb.demotable --append -m 1

相关问题