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

Hadoop 使用sqoop导入,如何将行追加到现有配置单元表中?,hadoop,hive,sqoop,Hadoop,Hive,Sqoop,我使用下面的查询从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 ',' 命令成功,导

我使用下面的查询从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作业因错误而失败

错误工具。导入工具:导入期间出错:导入作业失败

我哪里做错了?使用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
虽然它解决了上述问题,但我无法插入修改过的行。有没有办法插入修改过的行而不使用
--增量lastmodified参数。

我们可以使用以下命令:

 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

为了将行追加到配置单元表,请使用以前使用过的查询,只需删除--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
附加到以前的记录

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

使用
--append
选项和
-m1
,因此如下所示:

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

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

缺少--hive overwrite和--create配置单元表时,默认行为是追加。(至少在这方面

我同意nakulchawla09的回答。尽管提醒自己保留--split by选项。这将确保在配置单元数据存储中正确创建拆分名称。否则您将不喜欢默认命名。如果您不关心后台配置单元仓库命名和后台数据存储,您可以忽略此注释。当我尝试单击下面的命令

追加之前的

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
追加之前的配置单元仓库中的文件

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
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
它创建了以下文件。您可以看到文件名不是很好,因为没有提供“按拆分”选项或“拆分哈希”(可以是datetime或date)

蜂巢记录现在追加

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

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

你能用--verbose运行并得到正确的错误消息吗?我试过你的命令,我得到下面的错误“必须用--target dir指定目的地。”但是用--hive import--hive table它会直接在/user/hive/warehouse/right中创建一个表?好的,我会试试。madhu:我更新了描述。请看。