如何使用 Hive MACRO 减少样板代码
How to use Hive MACRO to reduce boilerplate
我的 Hive 代码具有包含 15 个复杂的 LATER VIEW 的重复模式。
为了简洁起见,下面我简化了爆炸代码:
SELECT a,b,c,d FROM t
LATERAL VIEW explode(split(regexp(s,'A',''),',')) a as a
LATERAL VIEW explode(split(regexp(s,'B',''),',')) b as b
LATERAL VIEW explode(split(regexp(s,'C',''),',')) c as c
LATERAL VIEW explode(split(regexp(s,'D',''),',')) d as d
...
我尝试使用 MACRO 来消除输入 15 次非常相似的复杂爆炸表达式(仅相差 1 个参数)。
我创建了以下宏:
CREATE TEMPORARY MACRO explode_me(s string, p string)
explode(split(regexp(s,p,''),','))
;
SELECT a FROM t
LATERAL VIEW explode_me(s,'A') a as a
我收到错误:
SemanticException [错误 10081]:UDTF 在 SELECT 子句之外不受支持,也不嵌套在表达式中
我理解错误。
我不明白如何让我的代码更紧凑。
我能够通过从宏主体中删除 explode() 并仅在宏中保留 split() 来解决它。
我的 Hive 代码具有包含 15 个复杂的 LATER VIEW 的重复模式。
为了简洁起见,下面我简化了爆炸代码:
SELECT a,b,c,d FROM t
LATERAL VIEW explode(split(regexp(s,'A',''),',')) a as a
LATERAL VIEW explode(split(regexp(s,'B',''),',')) b as b
LATERAL VIEW explode(split(regexp(s,'C',''),',')) c as c
LATERAL VIEW explode(split(regexp(s,'D',''),',')) d as d
...
我尝试使用 MACRO 来消除输入 15 次非常相似的复杂爆炸表达式(仅相差 1 个参数)。
我创建了以下宏:
CREATE TEMPORARY MACRO explode_me(s string, p string)
explode(split(regexp(s,p,''),','))
;
SELECT a FROM t
LATERAL VIEW explode_me(s,'A') a as a
我收到错误:
SemanticException [错误 10081]:UDTF 在 SELECT 子句之外不受支持,也不嵌套在表达式中
我理解错误。 我不明白如何让我的代码更紧凑。
我能够通过从宏主体中删除 explode() 并仅在宏中保留 split() 来解决它。