GreenPlum SQL 到 HiveSQL 的查询语句迁移

Posted

技术标签:

【中文标题】GreenPlum SQL 到 HiveSQL 的查询语句迁移【英文标题】:GreenPlum SQL to HiveSQL migration of query statement 【发布时间】:2021-04-07 11:16:34 【问题描述】:

我们必须按照以下语句将 GreenPlum SQL 迁移到 HIVESQL,请帮助我们。

to_date(b.birthday,'yyyymmddhh24miss')
extract(year from age(iDATE, to_date(b.birthday,'yyyymmddhh24miss')))

以上两条语句需要将SQL转换为HIVE。请帮帮我。

蜂巢版本:3.1.X

【问题讨论】:

【参考方案1】:

相当于to_date(b.birthday,'yyyymmddhh24miss')

from_unixtime(unix_timestamp(b.birthday,'yyyyMMddHHmmss')) 

但是,我不明白这个extract(year from age(iDATE, to_date(b.birthday,'yyyymmddhh24miss')))。您需要 iDate 和生日的区别吗? 如果是,您可以使用年份来获取日期差异。

datediff(iDate,from_unixtime(unix_timestamp(b.birthday,'yyyyMMddHHmmss')) )/365

Hive 还有extract (year from datetimestamp) 函数。

【讨论】:

select extract(year from age('2021-04-21', to_date('2021-04-25','yyyymmddhh24miss'))) --- 是的,我们只是将 idate 作为参数传递 age 将不支持hiveSQL,取而代之,我们如何使用? 您可以计算年龄 - 这是一年中日期之间的差异(我认为)。因此,使用datediff 找出日期的差异,然后将其除以 365.25 以获得确切的年份差异(如果需要,您可以转换为 INT)。【参考方案2】:

另一种提取时间戳的方法是使用 regexp_replace:

regexp_replace(b.birthday,'^(\\d4)(\\d2)(\\d2)(\\d2)(\\d2)(\\d2)$','$1-$2-$3 $4:$5:$6')

年龄是:

cast(datediff(current_date,
             regexp_replace(b.birthday,'^(\\d4)(\\d2)(\\d2)(\\d2)(\\d2)(\\d2)$','$1-$2-$3 $4:$5:$6')
             )/365.25 as int)

【讨论】:

嗨,我们如何将 lpad(extract('hour' from time_stamp),2,0) 转换为 event_hour --? time_stamp 是列 @karthikelavan 请创建另一个问题,不要在 cmets 中提出新问题。另外,如果有效,请不要忘记接受/投票答案

以上是关于GreenPlum SQL 到 HiveSQL 的查询语句迁移的主要内容,如果未能解决你的问题,请参考以下文章

支持greenplum string_agg 转换成hivesql

greenplum STRING_AGG 函数转换为 hiveSQL

GreenPlum SQL 查询转换成 Hive

从 Greenplum Query 迁移 Hive 日期和周函数

PLSQL 到 Hive 查询函数的对话

如何查看hivesql里执行了哪些查询