我完成了一个读取itunesepf文件并将这些记录插入mysql数据库表的过程。其中,在插入记录之前,我需要检查给定的记录是否存在于数据库中,如果该记录不存在,则我需要插入该记录,但如果该记录已经存在于数据库中,则需要在mysql中更新相应的记录。如何在mysql中检查记录的存在。是否可以在mapper或reducer类中执行此检查。。?以及,如果记录存在,如何更新记录。
mwg9r5ms1#
使用sqoop
首先,表应该有主键或唯一键。
--更新键用于更新的锚列。如果有多个列,请使用逗号分隔的列列表
sqoop export --connect jdbc:mysql://localhost/test --username root --password root --table tempo --export-dir /input_test_files/sqoop_col -m 1 --update-key "unique_key_column" --update-mode allowinsert
--udate模式指定在数据库中发现具有不匹配键的新行时如何执行更新。
法律价值是:
updateonly:只更新数据库中存在的行,而忽略不存在的行。allowinsert:如果行已经存在于数据库中,则更新行;如果行不存在,则插入行。
izj3ouym2#
使用暂存表来集成来自不同平台的数据是一个更健壮的解决方案。在map阶段为每个记录查询数据库不是一个好方法,并且不能提供数据加载的一致性。所以,在mysql的stg模式(或类似模式)中创建类似于目标表的表(带有2个add字段:“load \u ts”、“update \u ts”),从mapred job(或sqoop,…)填充它,使用 merge 子句(如果不存在则为模拟)来填充目标mysql表
merge
2条答案
按热度按时间mwg9r5ms1#
使用sqoop
首先,表应该有主键或唯一键。
--更新键用于更新的锚列。如果有多个列,请使用逗号分隔的列列表
--udate模式指定在数据库中发现具有不匹配键的新行时如何执行更新。
法律价值是:
updateonly:只更新数据库中存在的行,而忽略不存在的行。
allowinsert:如果行已经存在于数据库中,则更新行;如果行不存在,则插入行。
izj3ouym2#
使用暂存表来集成来自不同平台的数据是一个更健壮的解决方案。在map阶段为每个记录查询数据库不是一个好方法,并且不能提供数据加载的一致性。所以,
在mysql的stg模式(或类似模式)中创建类似于目标表的表(带有2个add字段:“load \u ts”、“update \u ts”),
从mapred job(或sqoop,…)填充它,
使用
merge
子句(如果不存在则为模拟)来填充目标mysql表