【问题标题】:Update mysql record from hadoop从hadoop更新mysql记录
【发布时间】:2014-06-06 11:23:44
【问题描述】:

我完成了读取 iTunes EPF 文件并将这些记录插入 mysql 数据库表的过程。

其中,插入之前记录我需要检查给定的记录是否存在于数据库中如果记录不存在,那么我将插入记录。但是如果数据库中已经存在记录,那么我需要更新mysql中的相应记录。

如何检查mysql中是否存在记录。是否可以在 Mapper 或 Reducer 类中进行此检查..?以及,如果记录存在如何更新记录。

【问题讨论】:

    标签: mysql hadoop hadoop-streaming hadoop-plugins hadoop-partitioning


    【解决方案1】:

    使用临时表来集成来自不同平台的数据是一种更强大的解决方案。在 map 阶段为每条记录查询数据库不是一个好方法,并且不提供数据加载的一致性。所以,

    1. 像目标表一样创建表(添加 2 个字段:'load_ts', 'update_ts')在 mysql 中的 STG 模式(或类似模式)中,
    2. 从 MapRed Job(或 Sqoop,...)填充它,
    3. 使用merge 子句(或模拟,如果不存在)填充目标 mysql表

    【讨论】:

      【解决方案2】:

      使用 sqoop

      首先应该有表的主键或唯一键。
      --update-key 用于更新的锚列。如果有多个列,请使用逗号分隔的列列表

      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-mode 指定当在数据库中发现具有不匹配键的新行时如何执行更新。
      合法值为:
      updateonly :仅更新数据库中存在的行,如果不存在则忽略。
      allowinsert :如果行已存在于数据库中则更新行,如果行不存在则插入行。

      【讨论】:

        猜你喜欢
        • 2015-06-12
        • 1970-01-01
        • 2012-11-22
        • 1970-01-01
        • 1970-01-01
        • 2015-04-10
        • 2013-07-18
        • 2012-05-10
        • 1970-01-01
        相关资源
        最近更新 更多