Presto 从Hive迁移


Presto使用ANSISQL语法和语义,而Hive使用一种称为HiveQL的类SQL语言,它在MySQL之后松散地建模(它本身与ANSISQL有很多不同之处)。

使用下标访问数组的动态索引而不是udf

SQL中的下标操作符支持全表达式,不像Hive(它只支持常量)。因此,您可以编写如下查询:

SELECTmy_array[CARDINALITY(my_array)]aslast_element
FROM...

避免数组的越界访问

访问数组的越界元素将导致异常。您可以通过以下方式避免这种if情况

SELECTIF(CARDINALITY(my_array)>=3,my_array[3],NULL)
FROM...

对数组使用ANSISQL语法

数组从1开始索引,而不是从0开始:

SELECTmy_array[1]ASfirst_element
FROM...

使用ANSI语法构造数组:

SELECTARRAY[1,2,3]ASmy_array

对标识符和字符串使用ANSISQL语法

字符串用单引号分隔,标识符用双引号引用,而不是反引号:

SELECTnameAS"UserName"
FROM"7day_active"
WHEREname='foo'

以数字开头的标识符

以数字开头的标识符在ANSISQL中是不合法的,必须使用双引号引起来:

SELECT*
FROM"7day_active"

使用标准字符串连接运算符

使用ANSISQL字符串连接运算符:

SELECTa||b||c
FROM...

对CAST目标使用标准类型

CAST目标支持以下标准类型:

SELECT
CAST(xASvarchar)
,CAST(xASbigint)
,CAST(xASdouble)
,CAST(xASboolean)
FROM...

特别是,使用VARCHAR代替STRING。

整数除法时使用CAST

Presto遵循在对两个整数进行除法时执行整数除法的标准行为。例如,除以72将导致3,而不是3.5。要对两个整数执行浮点除法,请将其中一个转换为double:

SELECTCAST(5ASDOUBLE)/2

将WITH用于复杂的表达式或查询

当您想将复杂的输出表达式重新用作过滤器时,请使用内联子查询或使用以下WITH子句将其分解:

WITHaAS(
SELECTsubstr(name,1,3)x
FROM...
)
SELECT*
FROMa
WHEREx='foo'

使用UNNEST扩展数组和映射

Presto支持UNNEST来扩展数组和映射。使用UNNEST代替。LATERALVIEWexplode()

蜂巢查询:

SELECTstudent,score
FROMtests
LATERALVIEWexplode(scores)tASscore;

Presto查询:

SELECTstudent,score
FROMtests
CROSSJOINUNNEST(scores)ASt(score);