2016-07-22 44 views
1

可以说我有一个计算列: -如何避免评估在蜂巢查询相同的计算列repetedly

select str_to_map("k1:1,k2:2,k3:3")["k1"] as col1, 
     str_to_map("k1:1,k2:2,k3:3")["k2"] as col2, 
     str_to_map("k1:1,k2:2,k3:3")["k3"] as col3; 

如何“修复”列仅计算一次,并访问其值中多次查询?正在计算的地图是相同的,只有不同的列访问不同的键。反复执行相同的计算是浪费资源。这个例子故意做得过于简单,但重点是我想知道如何避免Hive中的这种冗余。

回答

0

通常使用子查询,它们被计算一次。

select map_col.["k1"] as col1, 
     map_col.["k2"] as col2, 
     map_col.["k3"] as col3 
from 
(
select str_to_map("k1:1,k2:2,k3:3") as map_col from table... 
)s; 

此外,您还可以将某些查询实现为表,以在不同的查询或工作流中重用数据集。

+0

这将是微不足道的场景。对我来说真正的挑战是有一个更大的查询,它必须适合。如果我创建子查询,会有连接进入画面。我的简单问题是 - 我想在行级别计算某些结果并将其用于计算多列 – Dhiraj

+0

它应该像在与Hive中的横向视图一起使用时的json_tuple行为一样。它保持单行冻结,我们可以在主查询中多次使用该行内的成员,而无需任何联接。但不是json_tuple我有其他函数返回一个Map现在我想要访问的地图的成员来计算N个不同的列。 – Dhiraj

+0

子查询不一定加入,在我的回答中,这不是一个加入。您也可以使用WITH c(sbquery here ...)作为subq1,然后在更复杂的查询中引用它作为subq1,即使对于连接,子查询也会计算一次。你提到的横向视图基本上是一个连接。 – leftjoin