【Hive 如何举行update更新?】

打印 上一主题 下一主题

主题 970|帖子 970|积分 2910

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Hive 是一个基于 Hadoop 的数据分析工具,可以使用类 SQL 语法举行离线数据分析,节省学习成本和扩展功能。
Hive 最初设计时主要是面向批处理和大数据分析,并不直接支持UPDATE和DELETE操纵,这是因为Hive的数据存储在HDFS上,而HDFS的设计遵照“一次写入,多次读取”的原则,不支持对文件的随机写入操纵。因此,在Hive中没有直接的UPDATE语句,那么如何对数据举行更新修改呢?
我们可以通过其他的方式来间接实现数据的更新,这里先容常用的几种: INSERT OVERWRITE 覆盖,暂时表,暂时分区。
1.INSERT OVERWRITE

通过覆盖原有数据的方式来间接实现更新,这种方法实用于数据量不大的情况。
假设现在有一张员工信息表,有 emp_id(员工编号),emp_name(员工名称),须要将emp_id = ‘1024’ 的名称修改为 ‘CodeBoy’。
  1. --示例
  2. INSERT OVERWRITE emp_info
  3. (emp_id
  4. ,emp_name
  5. )
  6. SELECT
  7. emp_id
  8. ,CASE   WHEN emp_id = '1024' THEN 'CodeBoy'
  9.         ELSE                       emp_name
  10. END     AS emp_name
  11. FROM emp_info
  12. WHERE ...
  13. /*SQL*/;
复制代码
2.暂时表

暂时表顾名思义暂时存放数据的表,通过创建一张暂时表,将须要修改数据的表数据插入复制到暂时表中,再从暂时表中按须要更新的加工逻辑举行代码加工后重新插入到正常表中,实现更新数据的功能。
假设现在有一张员工信息表,有 emp_id(员工编号),emp_name(员工名称),须要将emp_id = ‘1024’ 的名称修改为 ‘CodeBoy’。
  1. --示例
  2. --1. 创建一张临时表 tmp_emp_info ,表结构和数据与 emp_info 保持一致
  3. CREATE TABLE IF NOT EXISTS tmp_emp_info AS SELECT * FROM emp_info;
  4. /*
  5. * 如果是全表修改,可以先使用 truncate emp_info; 语句先将原表的数据全部删除,再直接 INSERT INTO 从临时表插入修改后的数据
  6. * ,但是切记一定要慎重使用 trcuncate 语句,确保数据可以恢复及您的操作保证数据结果准确
  7. */
  8. --2. 将临时表数据插入原表时对数据进行处理
  9. INSERT OVERWRITE emp_info
  10. (emp_id
  11. ,emp_name
  12. )
  13. SELECT
  14. emp_id
  15. ,CASE   WHEN emp_id = '1024' THEN 'CodeBoy'
  16.         ELSE                       emp_name
  17. END     AS emp_name
  18. FROM tmp_emp_info
  19. WHERE ...
  20. /*SQL*/;
  21. /*最后如果确保数据正确后可以删除临时表,减少存储压力*/
  22. DROP TABLE IF EXISTS tmp_emp_info;
复制代码
创建暂时表备份数据可以见之前的文章:【Impala SQL 造数(一)】
3.暂时分区

在举行大数据量处理和分析时,为了优化存储和查询效率,每每会把表建成分区表,如按日期分区,暂时分区即可以是还没有数据的日期。
如果仅仅只是某个日期的数据须要修改更新,则可以只针对某个分区操纵,与暂时表雷同,先把当前日期分区(‘2024-12-14’)的数据复制到还没有建立的日期分区(‘9999-12-31’)中,然后将暂时分区数据修改更新后再重新插入正常分区中即可,暂时分区较暂时表的利益之一就是如果一张表有很多分区,仅操纵某个分区比操纵一张表的数据量较少。
  1. -- 示例
  2. --1. 将正常分区的数据复制到临时分区中
  3. INSERT INTO emp_info
  4. (
  5. data_dt
  6. ,emp_id
  7. ,emp_name
  8. )
  9. SELECT
  10. CAST( '9999-12-31'  AS DATE )  AS data_dt
  11. ,emp_id
  12. ,emp_name
  13. FROM tmp_emp_info
  14. WHERE data_dt = '2024-12-14'
  15. AND emp_id NOT IN ('1024')
  16. /*SQL*/;
  17. --2.将临时分区的数据覆盖到正常分区
  18. INSERT OVERWRITE emp_info
  19. (
  20. data_dt
  21. ,emp_id
  22. ,emp_name
  23. )
  24. SELECT
  25. CAST( '2024-12-14'   AS DATE )  AS data_dt
  26. ,emp_id
  27. ,emp_name
  28. FROM emp_info
  29. WHERE data_dt = '9999-12-31'
  30. /*SQL*/;
  31. --3.将修改更新后的数据插入到正常分区中
  32. INSERT INTO emp_info
  33. (
  34. data_dt
  35. ,emp_id
  36. ,emp_name
  37. )
  38. SELECT
  39. CAST( '2024-12-14'  AS DATE    )  AS data_dt
  40. ,CAST( '1024'       AS STRING  )  AS emp_id
  41. ,CAST( 'CodeBoy'    AS STRING  )  AS emp_name
  42. FROM emp_info
  43. /*SQL*/;
复制代码
这里举的数据修改例子都很简朴,而且这里特意比暂时表方法多了一个步骤,意在表达方法很多,可以按实际情况选择。
小结

以上通过表覆盖、暂时表、暂时分区的方法列举了如何在 Hive 中实现数据修改更新操纵,可以根据实际需求场景举行开辟和测试,而且要多思索,多总结,比如从这个小例子可以总结出:一条路不通可以迂回一下,采用别的方式实现也是一种不错的解决思绪。
以上,一切祝好!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表