每天自动更新一个 Hive 视图

Automatically Updating a Hive View Daily

我有一个要求要满足。我需要将数据从 DB sqoop 到 Hive。我每天都在 sqooping,因为这些数据每天都会更新。

此数据将用作来自 spark 消费者的查找数据以进行充实。我们想保留我们收到的所有数据的历史记录,但我们不需要所有数据来查找最新数据(同一天)。我正在考虑从历史 table 创建一个配置单元视图,并且只显示当天插入的记录。有没有一种方法可以每天自动执行视图,以便视图查询始终具有最新数据?

我假设您正在将每日交易记录加载到您的历史记录 table 中,其中包含最后修改日期。每次您向历史记录 table 插入或更新记录时,您的 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 manuual

Q: Is there a way to automate the view on a daily basis so that the view query will always have the latest data?

如果您根据日期获得分区table,则无需update/automate该过程。

Q: We want to keep a history of all the data we have received but we don't need all the data for lookup only the latest data (same day).


注意 :配置单元视图或配置单元 table 你应该始终避免扫描完整的 table 数据也就是完整的 table 扫描以获得最新的分区数据。

选项 1:查询数据的配置单元方法

如果你想适应配置单元的方法

您必须使用分区列,例如:partition_date 并在 hive

中分区 table
 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 

总是给出最新的分区。 (如果分区数据中有同一天或今天的日期,那么它将给出同一天的分区数据,否则它将给出最大值 partition_date)及其来自分区 table.

的数据

选项 2:查询数据的普通 spark 方法 使用 spark show partitions 命令,即 spark.sql(s"show Partitions $yourpartitionedtablename") 在数组中获取结果并对其进行排序以获得最新的分区日期。使用它,您可以使用 spark 组件仅查询最新的分区日期作为查找数据。

将我的回答视为 getting latest partition date.

的想法

I prefer option2 since no hive query is needed and no full table query since we are using show partitions command. and no performance bottle necks and speed will be there.

另一个不同的想法是使用 HiveMetastoreClient 或选项 2 进行查询...请参阅此和 my answer and the other