每天自动更新配置单元视图

dw1jzc5e  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(421)

我有个要求要满足。我需要把数据从数据库转到配置单元。因为这些数据每天都在更新,所以我每天都在工作。
此数据将用作spark consumer的查找数据,以进行充实。我们想保留我们收到的所有数据的历史记录,但我们不需要所有的数据来查找最新的数据(同一天)。我在考虑从历史表创建一个配置单元视图,只显示当天插入的记录。有没有一种方法可以每天自动化视图,以便视图查询始终具有最新的数据?

fnatzsnv

fnatzsnv1#

问:有没有一种方法可以每天自动生成视图,以便视图查询始终拥有最新的数据?
如果得到基于日期的分区表,则无需更新/自动化流程。
问:我们想保留我们收到的所有数据的历史记录,但我们不需要所有的数据来查找最新的数据(同一天)。
注意:无论是配置单元视图还是配置单元表,您都应该避免扫描完整表数据(也称为完整表扫描)以获取最新的分区数据。
选项1:查询数据的配置单元方法
如果你想适应Hive的方法
必须使用分区列,例如: partition_date 以及Hive中的分区表

select *  from table where partition_column in 
    (select max(distinct partition_date  ) from yourpartitionedTable)

或者

select  * from (select *,dense_rank() over (order by partition_date  desc) dt_rnk from db.yourpartitionedTable ) myview
    where myview.dt_rnk=1

将始终提供最新的分区(如果分区数据中有当天或今天的日期,则它将给出当天的分区数据,否则它将给出最大分区(日期)及其分区表中的数据。
选项2:使用spark查询数据的普通spark方法 show partitions 命令,即。 spark.sql(s"show Partitions $yourpartitionedtablename") 在数组中获取结果并对其排序以获取最新的分区日期。使用它,您可以使用spark组件仅查询最新的分区日期作为查找数据。
把我的答案看作是获取最新分区日期的想法。
我更喜欢选项2,因为不需要配置单元查询,也不需要完整表查询,因为我们使用的是show partitions命令。不会出现性能瓶颈和速度瓶颈。
另一个不同的想法是质疑 HiveMetastoreClient 或者选择2。。。看看这个,我的答案,还有另一个

2vuwiymt

2vuwiymt2#

我假设您正在将带有最后修改日期的每日事务记录加载到历史记录表中。每次向历史记录表插入或更新记录时,都会更新上次修改的日期列。也可以是日期或时间戳。您可以在配置单元中创建一个视图,以便使用分析函数获取最新的数据。
以下是一些示例数据:

CREATE TABLE IF NOT EXISTS db.test_data
(
 user_id int
,country string
,last_modified_date date
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS orc
;

我插入了一些样本记录。你会看到同一个id有多个不同日期的记录。

INSERT INTO TABLE db.test_data VALUES
(1,'India','2019-08-06'),
(2,'Ukraine','2019-08-06'),
(1,'India','2019-08-05'),
(2,'Ukraine','2019-08-05'),
(1,'India','2019-08-04'),
(2,'Ukraine','2019-08-04');

在配置单元中创建视图:

CREATE VIEW db.test_view AS
select user_id, country, last_modified_date
from ( select user_id, country, last_modified_date, 
              max(last_modified_date) over (partition by user_id) as max_modified 
       from db.test_data ) as sub
where   last_modified_date = max_modified 
;

hive> select * from db.test_view;

1       India   2019-08-06
2       Ukraine 2019-08-06
Time taken: 5.297 seconds, Fetched: 2 row(s)

它只显示了最大日期的结果。
如果您进一步插入另一组记录,其最大上次修改日期为:

hive> INSERT INTO TABLE db.test_data VALUES
    > (1,'India','2019-08-07');

hive> select * from db.test_view;

1       India   2019-08-07
2       Ukraine 2019-08-06

为了reference:hive view 手工

相关问题