从 HIVE 表中获取最新的分区

Posted

技术标签:

【中文标题】从 HIVE 表中获取最新的分区【英文标题】:FETCH the latest partition from HIVE table 【发布时间】:2021-05-11 14:38:07 【问题描述】:

您好,我对此非常陌生。 我有三列 INTEGER 格式的 YEAR、MONTH、DAY。

我想加载脚本并将 YEAR、MONTH、DAY 组合为单列并获取最大值。

我试过了,

Load year,month,date from HIVE.`abc`.`abc1';
SELECT max(cast(year as String) || '_' || cast(month as string) || '_' || cast(day as string)) as result FROM HIVE.`abc`.`abc1';

通过这样做,我将得到 2020_5_21 的结果。但我应该使用分隔符并找到日期的最大值。

发生以下错误:连接器回复错误:SQL##f - SqlState: S1000, ErrorCode: 35, ErrorMsg: [Cloudera][Hardy] (35) 错误 来自服务器:错误代码:'1' 错误消息:'编译时出错 语句:失败:执行错误,返回代码 1 从 org.apache.hadoop.hive.ql.exec.tez.TezTask'。

我想在 WHERE 子句中使用结果。但我不知道声明。 SQL select * from HIVE.abc.`abc1' where ---- ;

请帮忙。

【问题讨论】:

检查作业跟踪器并在失败的容器日志中找到异常消息。控制台异常消息不提供信息 【参考方案1】:

如果月份和日期存储为整数,如果是个位数的月份或日期,则需要使用 lpad() 加零。例如月份 5 应该变成 05。没有这个最大值可能无法正常工作。也可以使用破折号作为分隔符来获得兼容格式的日期。

max(concat(year,'-',lpad(month, 2,0),'-',lpad(day, 2,0)))

要在 WHERE 中使用它,请使用 WHERE date in (select max ...):

SELECT * from your_table
WHERE concat(year,'-',lpad(month, 2,0),'-',lpad(day, 2,0)) in (select max(concat(year,'-',lpad(month, 2,0),'-',lpad(day, 2,0))) from your_table)

此外,您可能需要在 sql 中的任何地方用反引号引用年、月、日等名称:

max(concat(`year`,'-',lpad(`month`, 2,0),'-',lpad(`day`, 2,0)))

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 @leftjoin 最后,查询在设置队列名称后工作。谢谢。 @leftjoin 现在我的表中有重复项。同一行重复两次(empname 字段的大写和小写)通过具有不同值来更改查询的任何帮助。 @jaichu 请避免在 cmets 中提问。请使用数据示例和问题描述再创建一个问题,有人会提供帮助。重复问题与您最初的问题无关。

以上是关于从 HIVE 表中获取最新的分区的主要内容,如果未能解决你的问题,请参考以下文章

hive从查询中获取数据插入到表或动态分区

Hive - 仅获取一个或多个 hive 表的最新分区

从具有多个分区列的配置单元表中获取最新数据

Hive 动态分区

Hive / Hue 视图从最新分区(年/月/日)返回所有行

如何找到最新的分区值