Sqoop:如何在将数据从RDBMS导入Hive表时处理重复值

时间:2016-07-17 06:23:23

标签: sqoop

Sqoop:如何在将数据从RDBMS导入Hive表时处理重复值。

如果Hive Tables中已有值,可以处理冗余选项吗?

2 个答案:

答案 0 :(得分:1)

如果您的数据具有唯一标识符并且您正在运行增量导入,则可以在导入的-mergeKey值上指定它。这将合并表中已有的值和最新值。较新的将覆盖最旧的。

如果您没有运行增量导入,则可以使用sqoop merge来统一数据。 来自sqoop docs

合并数据集时,假设每条记录中都有唯一的主键值。主键的列使用--merge-key指定。同一数据集中的多个行不应具有相同的主键,否则可能会发生数据丢失。

重要的是,每个记录都有一个唯一的主键。否则,您可能在导入数据时生成一个。为此,您可以使用--query生成导入,并在选择连接现有列的数据时使用唯一键生成新列,直到获得唯一组合。

--query "SELECT CONVERT(VARCHAR(128), [colum1]) + '_' + CONVERT(VARCHAR(128), [column2]) AS CompoundKey ,* FROM [dbo].[tableName] WHERE \$CONDITIONS" \

答案 1 :(得分:0)

sqoop没有可以提供您正在寻找的解决方案的直接选项。您必须设置 EDW 类型的流程才能实现目标:

  1. 导入临时表中的数据(hive - 为此目的创建临时数据库) - 这应该是目标表的副本,但数据类型可能会根据您的转换要求而有所不同。
  2. 通过执行转换将数据从登台数据库表(hive)加载到目标数据库表(hive)。在你的情况下:

    Insert into table trgt.table 
    select * from stg.table stg_tbl 
    where stg_tbl.col1 not in (select col1 from trgt.table);
    

    此处trgt是目标数据库,stg是暂存数据库 - 两者都在蜂巢中。