Hive 如何避免在配置单元查询中重复计算同一计算列

Hive 如何避免在配置单元查询中重复计算同一计算列,hive,Hive,假设我有一个计算列:- 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; 如何在查询中只“修复”一次列计算并多次访问其值?正在计算的映射是相同的,只是针对不同的列访问不同的键。重复执行相同的计算是对资源的浪费。这个例子故意太简单了,但重点是我

假设我有一个计算列:-

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;

如何在查询中只“修复”一次列计算并多次访问其值?正在计算的映射是相同的,只是针对不同的列访问不同的键。重复执行相同的计算是对资源的浪费。这个例子故意太简单了,但重点是我想知道如何在蜂巢中避免这种冗余

在一般情况下,子查询只计算一次

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;

您还可以将某些查询具体化为表,以便跨不同的查询或工作流重用数据集

在一般情况下,子查询只计算一次

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;

您还可以将某些查询具体化为表,以便跨不同的查询或工作流重用数据集

这将是一个微不足道的场景。对我来说,真正的挑战是,还有一个更大的问题需要解决。若我创建子查询,将有连接进入图片。我的简单问题是——我想计算行级别的特定结果,并将其用于计算多个列。当与配置单元中的横向视图一起使用时,json_元组的行为应该类似。它冻结了一行,我们可以在主查询中多次使用该行中的成员,而无需任何类型的联接。但是我没有使用json_tuple,而是使用另一个函数返回一个映射,现在我要访问该映射的成员以计算N个不同的列。子查询不一定是联接,在我的回答中,这不是联接。您还可以将c(此处为sbquery…)用作subq1,然后在更复杂的查询中使用它作为subq1引用,即使对于联接,子查询也将计算一次。你们提到的横向视图基本上是一个连接,子查询和你们的问题完全匹配。加入或不加入它取决于您的决定(您更大的查询)。在配置单元中这样的事情是可能的,答案通常是子查询。还可以使用UDF,也可以使用中间表(缓存)。这一切都取决于实际用例。您提供了简化的问题,我提供了一般的解决方案。这将是一个微不足道的场景。对我来说,真正的挑战是,还有一个更大的问题需要解决。若我创建子查询,将有连接进入图片。我的简单问题是——我想计算行级别的特定结果,并将其用于计算多个列。当与配置单元中的横向视图一起使用时,json_元组的行为应该类似。它冻结了一行,我们可以在主查询中多次使用该行中的成员,而无需任何类型的联接。但是我没有使用json_tuple,而是使用另一个函数返回一个映射,现在我要访问该映射的成员以计算N个不同的列。子查询不一定是联接,在我的回答中,这不是联接。您还可以将c(此处为sbquery…)用作subq1,然后在更复杂的查询中使用它作为subq1引用,即使对于联接,子查询也将计算一次。你们提到的横向视图基本上是一个连接,子查询和你们的问题完全匹配。加入或不加入它取决于您的决定(您更大的查询)。在配置单元中这样的事情是可能的,答案通常是子查询。还可以使用UDF,也可以使用中间表(缓存)。这一切都取决于实际用例。你们提供了简化的问题,我提供了一般的解决方案。