我从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
虽然它解决了上述问题,但我无法插入修改后的行。有没有办法插入修改后的行而不使用 - 增量lastmodified 参数。
答案 0 :(得分: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 :(得分:1)
我不确定是否可以使用--hive-import选项在sqoop中直接给出--append选项。它至少在1.4版中仍然不可用。
当缺少--hive-overwrite和--create-hive-table时,默认行为是append。 (至少在这种情况下。
我同意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
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
已添加蜂巢记录
beeline:hive2>从地理位置中选择count(*);
+-------+--+
| _c0 |
+-------+--+
| 16000 |
+-------+--+
答案 2 :(得分: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
答案 3 :(得分: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