【发布时间】:2020-05-23 18:17:06
【问题描述】:
例如。如果我的日期列是 load_date,则使用 max(load_date) 运算符将扫描 hive 中的每个数据文件,使其成为一项昂贵的操作。相反,是否有任何最佳方法可以从表中获取最新的 load_date。
【问题讨论】:
标签: sql hadoop hive hiveql hadoop-partitioning
例如。如果我的日期列是 load_date,则使用 max(load_date) 运算符将扫描 hive 中的每个数据文件,使其成为一项昂贵的操作。相反,是否有任何最佳方法可以从表中获取最新的 load_date。
【问题讨论】:
标签: sql hadoop hive hiveql hadoop-partitioning
只是想出 Hive,假设您已经为 Metastore 而不是 derby 和分区列 load_date 配置了 mysql。
建议 1: 此查询为您提供所有分区名称。执行子字符串 (day=2020-05-24) 并从中取出日期部分并将其转换为日期,然后获取最大值。
mysql> select PART_NAME FROM PARTITIONS WHERE TBL_ID=(SELECT TBL_ID FROM TBLS WHERE TBL_NAME='PARTITIONED_TABLE');
建议 2: 如果您没有 mysql 或访问问题,请使用以下命令获取分区列表并编写一个读取该文件并给出最大 load_date 的 shell 脚本。
$hive -e 'show partitions table;' > partitions.txt
建议 3:在 Hive 中,方法是,只是为了避免全表扫描。这里的“-3”是可变的,如果你知道的话,把它改成最后一天成功的加载。
select max(load_date) from db.table_name
where load_date>date_add(current_date,-3)
注意:不确定如何使用 max(load_date) 的输出,您始终可以将值存储在 hive 表中并在查询中使用。
【讨论】:
Hive 中检查最大日期的唯一方法是使用 max 聚合函数。在你的情况下,它是max(load_date)。
不仅是 Hive,在任何关系数据库中,这是查找最新日期的方法。如果在您的设计中需要,您可以有一个元数据表,它记录了 hive 中加载的每个文件的统计信息,这有助于您获取最新记录
【讨论】: