使用sqoop导入,如何将行追加到现有的hive表中?

问题描述 投票:1回答:4

从SQL服务器我导入并使用以下查询创建了一个配置单元表。

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条记录的表。

我在SQL Server中插入了10条新记录,并尝试使用--where子句将这10条记录附加到现有的hive表中

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参数。

hadoop hive sqoop
4个回答
2
投票

为了将行附加到hive表,使用之前一直使用的相同查询,只需删除--hive-overwrite。

我将分享我在hive中导入的2个查询,一个用于覆盖,一个用于追加,您可以使用相同的导入:

要覆盖以前的记录

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个映射器,您也可以使用更多。


1
投票

我不确定你是否可以使用--hive-import选项在sqoop中直接提供--append选项。 1.4版本至少仍然无法使用它。

当缺少--hive-overwrite和--create-hive-table时,会追加默认行为。 (至少在这方面。

我和nakulchawla09的答案一起去了。虽然提醒自己保留--split-by选项。这将确保适当地创建配置单元数据存储中的拆分名称。否则你不会喜欢默认命名。如果您不关心后台配置单元仓库命名和后台数据存储,则可以忽略此注释。当我尝试使用以下命令

在追加之前

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

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

在追加之前在hive仓库中存档

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

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

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

它创建了以下文件。您可以看到文件名不是很好,因为没有给出分割选项或拆分哈希(可以是日期时间或日期)。

-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

现在附加了蜂巢记录

直线:hive2>从地理位置选择计数(*);

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

0
投票

我们可以使用这个命令:

 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

0
投票

使用--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
© www.soinside.com 2019 - 2024. All rights reserved.