从Hive迁移

openLooKeng使用ANSI SQL语法和语义,而Hive使用一种类似SQL的语言HiveQL。

使用下标代替UDF访问数组的动态索引

SQL中的下标运算符支持全表达式,而Hive只支持常量。因此,你可以如下编写查询:

  1. SELECT my_array[CARDINALITY(my_array)] as last_element
  2. FROM ...

避免越界访问数组

越界访问数组元素将导致异常。你可以使用if通过以下方式避免此情况:

  1. SELECT IF(CARDINALITY(my_array) >= 3, my_array[3], NULL)
  2. FROM ...

对数组使用ANSI SQL语法

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

  1. SELECT my_array[1] AS first_element
  2. FROM ...

使用ANSI语法构造数组:

  1. SELECT ARRAY[1, 2, 3] AS my_array

对标识符和字符串使用ANSI SQL语法

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

  1. SELECT name AS "User Name"
  2. FROM "7day_active"
  3. WHERE name = 'foo'

引用以数字开头的标识符

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

  1. SELECT *
  2. FROM "7day_active"

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

使用ANSI SQL字符串连接运算符:

  1. SELECT a || b || c
  2. FROM ...

使用CAST目标的标准类型

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

  1. SELECT
  2. CAST(x AS varchar)
  3. , CAST(x AS bigint)
  4. , CAST(x AS double)
  5. , CAST(x AS boolean)
  6. FROM ...

特别地,使用VARCHAR代替STRING

使用CAST进行整数除法

openLooKeng在对两个整数做除法时遵循执行整数除法的标准行为。例如,7除以2结果是3,而不是3.5。要对两个整数进行浮点除法,将其中一个转换为double:

  1. SELECT CAST(5 AS DOUBLE) / 2

复杂表达式或查询使用WITH

当希望将复杂的输出表达式重新用作筛选器时,可以使用内联子查询,也可以使用WITH子句将其分解出来:

  1. WITH a AS (
  2. SELECT substr(name, 1, 3) x
  3. FROM ...
  4. )
  5. SELECT *
  6. FROM a
  7. WHERE x = 'foo'

使用UNNEST来扩展数组和映射

openLooKeng支持unnest用于扩展数组和映射。使用UNNEST代替LATERAL VIEW explode()

Hive查询:

  1. SELECT student, score
  2. FROM tests
  3. LATERAL VIEW explode(scores) t AS score;

openLooKeng查询:

  1. SELECT student, score
  2. FROM tests
  3. CROSS JOIN UNNEST(scores) AS t (score);