合并最终表中的更新记录

镰刀

我在 Hive 中有一个用户表,形式如下:

User: 
Id    String,
Name  String,
Col1  String,
UpdateTimestamp Timestamp

我正在从具有以下格式的文件中在此表中插入数据:

I/U、记录写入文件时的时间戳、Id、名称、Col1、UpdateTimestamp

例如,插入一个 ID 为 1 的用户:

I,2019-08-21 14:18:41.002947,1,Bob,stuff,123456

并为 ID 为 1 的同一用户更新 col1:

U,2019-08-21 14:18:45.000000,1,,updatedstuff,123457

未更新的列返回为空。

现在,在 hive 中使用 load in path 在临时表中很容易进行简单的插入,然后忽略 stage 表中的前两个字段。

但是,我将如何处理更新语句?因此,我在 hive 中的最后一行如下所示:

1,Bob,updatedstuff,123457

我想在临时表中插入所有行,然后执行某种合并查询。有任何想法吗?

尼尔

通常,使用合并语句,您的“文件”在 ID 上仍然是唯一的,并且合并语句将确定是否需要将其作为新记录插入,或更新该记录中的值。

但是,如果文件是不可协商的并且始终具有 I/U 格式,则您可以将过程分为两个步骤,即插入,然后是更新,如您所建议的。

为了在 Hive 中执行更新,您需要将 users 表存储为 ORC 并在集群上启用 ACID。对于我的示例,我将使用集群键和事务表属性创建用户表:

create table test.orc_acid_example_users
(
  id int
  ,name string
  ,col1 string
  ,updatetimestamp timestamp
)
clustered by (id) into 5 buckets
stored as ORC
tblproperties('transactional'='true');

在插入语句之后,您的 Bob 记录会在col1以下内容中显示“东西”在此处输入图片说明

至于更新 - 您可以使用更新或合并语句来解决这些问题。我认为这里的关键是null价值观。如果文件中的临时表具有null,则保留原始名称或 col1 或其他名称很重要这是一个合并临时表字段的合并示例。基本上,如果暂存表中有一个值,则采用该值,否则回退到原始值。

merge into test.orc_acid_example_users as t
  using test.orc_acid_example_staging as s
on t.id = s.id
  and s.type = 'U'
when matched
  then update set name = coalesce(s.name,t.name), col1 = coalesce(s.col1, t.col1)

现在 Bob 将显示“updatedstuff” 在此处输入图片说明

快速免责声明 - 如果您在临时表中有多个 Bob 的更新,事情会变得一团糟。在执行更新/合并之前,您需要有一个预处理步骤来获取所有更新的最新非空值。Hive 并不是一个真正完整的事务性数据库 - 源最好在有更新时发送完整的用户记录,而不仅仅是更改的字段。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更新Access表中的记录

来自分类Dev

如何更新表中的记录?

来自分类Dev

mysql如何合并表中的类似记录

来自分类Dev

security.ubuntu.com 更新最终会合并到正常更新中吗?

来自分类Dev

更新计数> 1的表中的记录

来自分类Dev

从CTE结果更新表中的记录

来自分类Dev

使用游标更新Temp表中的记录

来自分类Dev

更新表中不存在的记录

来自分类Dev

使用某些条件更新表中的记录

来自分类Dev

更新计数> 1的表中的记录

来自分类Dev

更新链接表中的记录

来自分类Dev

合并两个Mysql表中的记录

来自分类Dev

如何使用Pyspark合并Databricks的Hive表中的记录?

来自分类Dev

合并表中的列返回相同记录的多次

来自分类Dev

如何合并联接表中的多个记录

来自分类Dev

在大型 PostgreSQL 表中处理/合并“后继记录”的方法?

来自分类Dev

计算表中的记录并使用游标更新表

来自分类Dev

从另一个表更新表中的记录

来自分类Dev

mysql更新表,如果记录不在临时表中

来自分类Dev

将最新记录与表合并

来自分类Dev

合并Purescript中的记录

来自分类Dev

更新语句更新表中的所有记录,而不更新与条件相关的记录

来自分类Dev

合并新表中的两个表与两个表的随机记录-C#

来自分类Dev

在 Laravel 中插入和更新 3 个表中的记录

来自分类Dev

需要检索表A中的所有记录,而表B中的单个记录是最近更新的

来自分类Dev

更新的记录插入到历史记录表中而不是旧记录

来自分类Dev

MYSQL在表1更新记录上的表2中插入新记录

来自分类Dev

更新表SQL Server中的前1条记录

来自分类Dev

在更新其余列的同时在表中插入不同的记录

Related 相关文章

热门标签

归档