当映射器的数量高于源hdfs位置中的块数时,sqoop export是否会创建重复项?
我的源hdfs目录有2400万条记录,当我执行sqoop导出到Postgres表时,它会以某种方式创建重复记录。我已将映射器的数量设置为24.源位置有12个块。
知道为什么sqoop会创建重复项吗?
使用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;
答案 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列)将所有唯一记录收集在一张表中,然后进行导出。 我认为它必须起作用