我有一个我想满足的要求。我需要将数据从 DB 转移到 Hive。我每天都在sqooping,因为这些数据每天都会更新。
此数据将用作来自 spark 消费者的查找数据以进行丰富。我们希望保留我们收到的所有数据的历史记录,但我们不需要所有数据来仅查找最新数据(同一天)。我正在考虑从历史表中创建一个配置单元视图,并且只显示当天插入的记录。有没有办法每天自动执行视图,以便视图查询始终拥有最新数据?
我有一个我想满足的要求。我需要将数据从 DB 转移到 Hive。我每天都在sqooping,因为这些数据每天都会更新。
此数据将用作来自 spark 消费者的查找数据以进行丰富。我们希望保留我们收到的所有数据的历史记录,但我们不需要所有数据来仅查找最新数据(同一天)。我正在考虑从历史表中创建一个配置单元视图,并且只显示当天插入的记录。有没有办法每天自动执行视图,以便视图查询始终拥有最新数据?
问:有没有办法每天自动执行视图,以便视图查询始终拥有最新数据?
如果您获得基于日期的分区表,则无需更新/自动化该过程。
问:我们希望保留我们收到的所有数据的历史记录,但我们不需要所有数据仅用于查找最新数据(同一天)。
注意:无论是配置单元视图还是配置单元表,您都应该始终避免扫描全表数据,即全表扫描以获取最新的分区数据。
选项 1:查询数据的 Hive 方法
如果你想适应蜂巢方法
例如,您必须使用分区列:partition_date
和配置单元中的分区表
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:使用 sparkshow partitions
命令查询数据的普通 spark 方法,spark.sql(s"show Partitions $yourpartitionedtablename")
即在数组中获取结果并对其进行排序以获得最新的分区日期。使用它,您可以使用 spark 组件仅查询最新的分区日期作为查找数据。
将我的回答视为获取最新分区日期的想法。
我更喜欢选项 2,因为我们使用的是 show partitions 命令,因此不需要配置单元查询,也不需要全表查询。并且不会出现性能瓶颈和速度。
另一个不同的想法是使用HiveMetastoreClient
或使用 option2 进行查询...查看这个和我的答案以及另一个
我假设您正在将带有最后修改日期的每日交易记录加载到您的历史记录表中。每次向历史表插入或更新记录时,都会更新 last_modified_date 列。它也可以是日期或时间戳。您可以在 hive 中创建一个视图以使用分析功能获取最新数据。
以下是一些示例数据:
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');
在 Hive 中创建视图:
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
供参考:Hive View 手册