oracle-hive同步-merge/delete

本文介绍了如何通过Hive查询来同步数据到Oracle,以实现增量更新和删除操作,从而减少全量推送的资源消耗。通过在Hive中执行全外连接查询,将新增和更新的数据写入一个表,删除或无效数据写入另一个表。然后,将这两个Hive表的数据推送到Oracle,并在Oracle端执行Merge语句以保持数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常在hive中进行数据处理,处理好的数据再推送到oracle中使用,需要保持两边数据一致,再推送的时候最好的方式是sqoop的merge形式全量推送,但这样消耗的资源、时间很长,可以只推送新增、更新、删除的数据给oracle,之后再再oracle中对目标表再单独的执行一段merge程序进行更新,筛选出这些数据的sql可参考下面这样的示例:

其中:from  使用多模式插入

     tel_m存储 新增、更新的数据

     tel_d存储需要删除的数据、无效数据

 from( select pre.tel_num  as  pre_tel_num,
             pre.shield_code        as  pre_shield_code,
              pre.shield_reason        as  pre_shield_reason,
             new.tel_num,
             new.shield_code,
              new.shield_reason
        from (select tel_num,
                

<think>我们有一个任务:使用Sqoop进行增量数据导入,并学习columns、where和query参数的用法。根据提供的引用,我们可以整合信息来构建一个教程。引用[1]展示了Sqoop将MySQL数据导入Hive的基本命令,但没有涉及增量导入和query等参数。引用[2]介绍了Sqoop是用于Hadoop和关系型数据库之间数据传输的工具,并提到以Oracle为例导入数据,但我们需要的是MySQL的例子。引用[3]给出了Sqoop的条件导入、增量导入以及在没有数字主键时如何使用文本列切分的例子,特别提到了使用`--split-by`和`-D`参数,还提到了`--where`参数。用户明确要求增量导入,以及columns、where、query参数的使用。在Sqoop中,增量导入有两种模式:`append`和`lastmodified`。-`append`模式:用于表中新增行,需要指定一个列(通常是自增ID)来跟踪新增加的行。-`lastmodified`模式:用于表中已有行的更新,需要指定一个时间戳列来跟踪更改。此外,我们还可以使用`--query`参数自定义SQL查询,同时使用`--where`参数进行简单的条件过滤,以及`--columns`指定要导入的列。下面我们逐步讲解:1.增量导入(IncrementalImport):Sqoop提供了`--incremental`参数来指定增量导入模式,同时需要指定:-`--check-column`:用于检查增量数据的列。-`--last-value`:上一次导入的该列的最大值(或时间戳)。示例(使用append模式):sqoopimport\--connectjdbc:mysql://hadoop:3306/db03\--usernamesqoop03\--password123456\--tablestudent\--target-dir/user/hive/warehouse/student\--incrementalappend\--check-columnid\--last-value100#表示上次导入的最后id是100,那么这次导入id>100的记录示例(使用lastmodified模式):sqoopimport\--connectjdbc:mysql://hadoop:3306/db03\--usernamesqoop03\--password123456\--tablestudent\--target-dir/user/hive/warehouse/student\--incrementallastmodified\--check-columnupdate_time\--last-value"2020-01-0100:00:00"#上次导入的最后时间戳,这次导入更新或新增的记录(注意:在lastmodified模式下,Sqoop会在导入后合并数据)2.`--where`参数:这个参数用于指定导入数据的条件,类似于SQL的WHERE子句,但不需要写WHERE关键字。示例:只导入age大于20的学生sqoopimport\--connectjdbc:mysql://hadoop:3306/db03\--usernamesqoop03\--password123456\--tablestudent\--where"age>20"\--target-dir/user/hive/warehouse/student_age_gt20注意:这个条件是在数据库服务器上执行的,所以效率较高。3.`--columns`参数:用于指定要导入的列,多个列名用逗号分隔(不要有空格)。示例:只导入id和name列sqoopimport\--connectjdbc:mysql://hadoop:3306/db03\--usernamesqoop03\--password123456\--tablestudent\--columns"id,name"\--target-dir/user/hive/warehouse/student_columns4.`--query`参数:这个参数允许我们使用自定义的SQL查询来导入数据。当使用`--query`时,必须同时指定`--split-by`(用于并行切分的列)以及`--target-dir`,并且不能使用`--table`参数。示例:使用自定义查询导入数据,并且可以包含JOIN操作sqoopimport\--connectjdbc:mysql://hadoop:3306/db03\--usernamesqoop03\--password123456\--query'SELECTs.id,s.name,c.course_nameFROMstudentsJOINcoursecONs.course_id=c.idWHERE$CONDITIONS'\--split-bys.id\--target-dir/user/hive/warehouse/student_course注意:在查询中必须包含`$CONDITIONS`,这是Sqoop在并行导入时用来替换条件的占位符。同时,`--split-by`指定切分字段。5.结合增量导入和query参数:我们可以将增量导入的条件放在自定义查询中,但通常我们也可以直接在where子句中处理。不过,Sqoop的增量导入参数(--incremental,--check-column,--last-value)不能直接与--query一起使用。因此,如果要使用query进行增量导入,我们需要在查询语句中自行添加条件。示例:使用query实现append增量导入sqoopimport\--connectjdbc:mysql://hadoop:3306/db03\--usernamesqoop03\--password123456\--query"SELECT*FROMstudentWHEREid>100AND\$CONDITIONS"\--target-dir/user/hive/warehouse/student_incremental\--split-byid\-m1#这里使用-m1表示只有一个map任务,如果数据量大,我们可以使用多个map任务,并指定split-by但是,这样我们就需要自己记录上一次的id最大值,而不是使用Sqoop自动保存的last-value(Sqoop在增量导入后会自动更新last-value记录,但这里不会)。因此,更常见的是使用Sqoop提供的增量导入机制。6.关于引用[3]中提到的,如果没有数字主键,可以使用文本列切分,但需要增加`-D`参数:-Dorg.apache.sqoop.splitter.allow_text_splitter=true示例:sqoopimport-Dorg.apache.sqoop.splitter.allow_text_splitter=true\--connectjdbc:mysql://192.168.58.203:3306/databasesname\--usernameroot\--password123\--tabletablename\--target-dir/sqoopdata/dirname\--delete-target-dir\--fields-terminated-by','\--split-byFieldName\#FieldName是一个文本类型的列-m2注意:使用`--query`时,如果查询中有WHERE子句,需要在条件中加入`$CONDITIONS`,并且整个查询语句用单引号括起来,以避免shell解释变量。在条件中,$CONDITIONS需要用双引号或者转义,如上例中我们使用了双引号,然后转义了美元符号(写成`\$CONDITIONS`),或者我们可以用单引号包裹整个查询,然后用`$CONDITIONS`(不转义),因为单引号会阻止变量扩展。最后,我们给出一个综合示例,使用增量导入(lastmodified模式)并指定列和条件:sqoopimport\--connectjdbc:mysql://hadoop:3306/db03\--usernamesqoop03\--password123456\--tablestudent\--columnsid,name,age,update_time\--where"age>18"\--hive-import\--hive-tablemyhive.student1\--incrementallastmodified\--check-columnupdate_time\--last-value"2023-01-0100:00:00"\--merge-keyid#在lastmodified模式中,我们通常需要指定一个合并键,以便将新数据和旧数据合并(对于更新操作)注意:`--merge-key`仅适用于lastmodified模式,它指定一个列(通常是主键)用于合并新记录和已有记录(HDFS上)。总结教程:-增量导入通过`--incremental`指定模式,并配合`--check-column`和`--last-value`使用。-`--where`用于条件过滤,`--columns`用于选择列,`--query`用于自定义复杂查询。-使用`--query`时必须指定`--split-by`和`--target-dir`,并且不能使用`--table`。请根据实际数据表结构和需求调整命令。</think> ### Sqoop 增量数据导入及参数使用教程 #### 一、增量导入模式 Sqoop 提供两种增量导入模式: 1. **append 模式**(增量追加) 适用于带有自增主键的表,语法: ```bash sqoop import \ --connect jdbc:mysql://hadoop:3306/db03 \ --username sqoop03 --password 123456 \ --table student \ --incremental append \ # 增量模式 --check-column id \ # 检查增量列(如主键) --last-value 1000 \ # 上次导入的最大值 --hive-import ``` 2. **lastmodified 模式**(时间戳更新) 适用于含时间戳字段的表,语法: ```bash sqoop import \ --connect jdbc:mysql://hadoop:3306/db03 \ --username sqoop03 --password 123456 \ --table student \ --incremental lastmodified \ # 时间戳模式 --check-column update_time \ # 时间戳字段 --last-value "2023-01-01" \ # 上次导入的最晚时间 --merge-key id # 合并依据的键 ``` #### 二、核心参数详解 1. **`--columns` 参数** ```bash --columns "id,name,age" # 指定导入的字段 ``` **示例**:仅导入姓名和年龄 ```bash sqoop import ... --columns "name,age" ``` 2. **`--where` 参数** ```bash --where "age > 18 AND dept='CS'" # SQL条件过滤 ``` **示例**:导入计算机系的学生 ```bash sqoop import ... --where "department='Computer Science'" ``` 3. **`--query` 参数** ```bash --query "SELECT * FROM student WHERE $CONDITIONS" ``` **注意事项**: - **必须包含 `$CONDITIONS`**(Sqoop分片占位符) - **必须指定 `--split-by`**(分片字段) - **禁用 `--table` 参数** **示例**:跨表联合查询 ```bash sqoop import \ --query "SELECT s.*, d.dept_name FROM student s JOIN department d ON s.dept_id=d.id WHERE $CONDITIONS" \ --split-by s.id \ # 指定分片字段 --target-dir /user/student_data ``` #### 三、综合应用实例 **场景**:增量导入年龄>20的计算机系学生数据到Hive ```bash sqoop import \ --connect jdbc:mysql://hadoop:3306/db03 \ --username sqoop03 --password 123456 \ --query "SELECT id, name, age FROM student WHERE age > 20 AND department='CS' AND \$CONDITIONS" \ --split-by id \ # 分片依据 --incremental append \ # 增量模式 --check-column id \ # 增量检测列 --last-value 5000 \ # 上次导入的ID最大值 --hive-import \ --hive-table myhive.student_cs \ --m 4 # 并行任务数 ``` > **关键说明**: > 1. 使用 `\$CONDITIONS` 需用反斜杠转义(避免shell解析) > 2. `last-value` 会记录在 Sqoop metastore(`sqoop-job`)中 > 3. 增量导入后可用 `sqoop job --exec` 创建自动化任务 #### 四、常见问题解决 1. **非数值分片字段处理**: ```bash -Dorg.apache.sqoop.splitter.allow_text_splitter=true \ --split-by name # 使用文本字段分片 ``` 2. **Hive表字段映射**: ```bash --map-column-hive age=INT,name=STRING # 指定Hive数据类型 ``` 3. **空值处理**: ```bash --null-string '\\N' \ # 字符空值替换 --null-non-string '0' # 数字空值替换 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值