Sqoop导出重复

时间:2016-10-14 22:07:34

标签: postgresql hive sqoop

当映射器的数量高于源hdfs位置中的块数时,sqoop export是否会创建重复项?

我的源hdfs目录有2400万条记录,当我执行sqoop导出到Postgres表时,它会以某种方式创建重复记录。我已将映射器的数量设置为24.源位置有12个块。

知道为什么sqoop会创建重复项吗?

  • Sqoop版本:1.4.5.2.2.9.2-1
  • Hadoop版本:Hadoop 2.6.0.2.2.9.2-1

使用Sqoop命令 -

sqoop export -Dmapred.job.queue.name=queuename \
--connect jdbc:postgresql://ServerName/database_name \
--username USER --password PWD \
--table Tablename \
--input-fields-terminated-by "\001" --input-null-string "\\\\N" --input-null-non-string "\\\\N" \
--num-mappers 24 -m 24 \
--export-dir $3/penet_baseline.txt -- --schema public;

3 个答案:

答案 0 :(得分:1)

bagavathi,您提到在目标表中看到重复的行,并且当您尝试添加PK约束时,由于PK违规而导致失败,此外,源没有重复的行。一种可能的情况是,由于先前的不完整sqoop作业,您的Target表可能已经具有也许的记录。请检查目标表是否具有也在源中的键。

此方案的一种解决方法是,使用参数“ --update-mode allowinsert”。在查询中,添加以下参数--update-key --update-mode allowinsert。这样可以确保如果表中已经存在键,那么记录将被更新;否则,如果sqoop将进行插入,则记录将被更新。

答案 1 :(得分:0)

没有sqoop不会两次导出记录,它与映射器数量和块数无关。

查看sqoop的pg_bulkload connector,以便在hdfs和postgres之间更快地进行数据传输。

  

pg_bulkload连接器是用于将数据导出到PostgreSQL的直接连接器。此连接器使用pg_bulkload。用户可以从pg_bulkload的功能中受益,例如绕过共享bufferes和WAL的快速导出,灵活的错误记录处理以及具有过滤功能的ETL功能。   默认情况下,sqoop-export会将新行追加到表中;每个输入记录都转换为INSERT语句,该语句将一行添加到目标数据库表。如果表具有约束(例如,其值必须唯一的主键列)并且已包含数据,则必须注意避免插入违反这些约束的记录。如果INSERT语句失败,导出过程将失败。此模式主要用于将记录导出到旨在接收这些结果的新空表。

答案 2 :(得分:0)

如果您使用了sqoop增量模式,则HDFS上会有很多重复的记录,在运行导出到postgres之前,请基于max(date或timestamp列)将所有唯一记录收集在一张表中,然后进行导出。 我认为它必须起作用