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
;
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
2条答案
按热度按时间fnatzsnv1#
问:有没有一种方法可以每天自动生成视图,以便视图查询始终拥有最新的数据?
如果得到基于日期的分区表,则无需更新/自动化流程。
问:我们想保留我们收到的所有数据的历史记录,但我们不需要所有的数据来查找最新的数据(同一天)。
注意:无论是配置单元视图还是配置单元表,您都应该避免扫描完整表数据(也称为完整表扫描)以获取最新的分区数据。
选项1:查询数据的配置单元方法
如果你想适应Hive的方法
必须使用分区列,例如:
partition_date
以及Hive中的分区表或者
将始终提供最新的分区(如果分区数据中有当天或今天的日期,则它将给出当天的分区数据,否则它将给出最大分区(日期)及其分区表中的数据。
选项2:使用spark查询数据的普通spark方法
show partitions
命令,即。spark.sql(s"show Partitions $yourpartitionedtablename")
在数组中获取结果并对其排序以获取最新的分区日期。使用它,您可以使用spark组件仅查询最新的分区日期作为查找数据。把我的答案看作是获取最新分区日期的想法。
我更喜欢选项2,因为不需要配置单元查询,也不需要完整表查询,因为我们使用的是show partitions命令。不会出现性能瓶颈和速度瓶颈。
另一个不同的想法是质疑
HiveMetastoreClient
或者选择2。。。看看这个,我的答案,还有另一个2vuwiymt2#
我假设您正在将带有最后修改日期的每日事务记录加载到历史记录表中。每次向历史记录表插入或更新记录时,都会更新上次修改的日期列。也可以是日期或时间戳。您可以在配置单元中创建一个视图,以便使用分析函数获取最新的数据。
以下是一些示例数据:
我插入了一些样本记录。你会看到同一个id有多个不同日期的记录。
在配置单元中创建视图:
它只显示了最大日期的结果。
如果您进一步插入另一组记录,其最大上次修改日期为:
为了reference:hive view 手工