【问题标题】:How to use derived columns in same hive table?如何在同一个配置单元表中使用派生列?
【发布时间】:2021-05-26 10:16:23
【问题描述】:

你能帮我下面的查询吗?

假设有表employee和列A、B和Date列。

我必须将数据从表employee加载到另一个表emp并应用以下转换

Employee 表中的转换

  1. A 列的绝对值 -(emp 中的列名将是 ABS_A)

  2. B 列的绝对值 -(emp 中的列名将是 ABS_B)

  3. 查找给定日期列的sum(ABS_A)

4.查找给定日期列的sum(ABS_b)

  1. 查找sum(ABS_A)/sum(ABS_B) - 列名称将为Average。

所以决赛桌 emp 将有下面的列

1.A

2.B

3.ABS_A

4.ABS_B

5.平均

如何在 hive 中处理这样的派生列?

我尝试了以下查询,但现在可以正常工作。谁能指导我。

insert overwrite into emp
select 
A,
B,
ABS(A) as ABS_A,
ABS(B) as ABS_B,
sum(ABS_A) OVER PARTION BY DATE AS sum_OF_A,
sum(ABS_B) OVER PARTTION BY DATE AS sum_of_b,
avg(sum_of_A,sum_of_b) over partition by date as average
from employee

【问题讨论】:

  • Tihis: "Find sum(ABS_A)/sum(ABS_B) " 与您的查询不匹配。目前尚不清楚您的理解中什么是平均水平。请提供一些数据示例和预期输出
  • 除了派生列的问题之外,平均计算似乎是错误的,它不应该是(按日期分区),因为 sum_of_A 和 sum_of_B 已经在同一个分区上计算(假设它有效),换句话说,每个日期组已经具有相同的 sum_OF_A 和 sum_OF_B。因此,请澄清您期望什么输出,并且最终输出中不存在日期列,这看起来很奇怪,因为总和是针对日期分区计算的。如果最终输出中没有日期,您将获得整个日期组的重复总和。更好地提供数据输入和期望的输出示例
  • 感谢您的回复@leftjoin:我已将表格屏幕截图附加到问题中。 “预期输出”应该与“Emp Table”中的一样。

标签: hadoop hive subquery bigdata derived-column


【解决方案1】:

Hive 不支持在同一子查询级别使用派生列。使用子查询或函数代替列别名。

insert overwrite table emp 
select A, B, ABS_A, ABS_B, sum_OF_A, sum_of_b, `date`, sum_OF_A/sum_of_b as average
from      
(
select A, B, ABS(A) as ABS_A, ABS(B) as ABS_B, `date`,
       sum(ABS(A)) OVER (PARTTION BY DATE) AS sum_OF_A, 
       sum(ABS(B)) OVER (PARTTION BY DATE) AS sum_of_b
  from employee
)s;

【讨论】:

  • 感谢@leftjoin - 在最终输出表“Emp”中,不需要以下两列“sum_OF_A, sum_of_b”。那么,我们需要一个临时表来计算平均值吗? ==="我还用公式更新了屏幕截图"。
  • @smp97 你的意思是子查询?没有你可以做的事 sum(ABS(A)) OVER (PARTTION BY DATE)/sum(ABS(B)) OVER (PARTTION BY DATE) 。我只是解释了可用的技术
  • @smp97 sum_OF_A 已经是日期分区中的总和。 sum_OF_A=C11+C12,除法即可
  • 在这种情况下如何处理除以 0。我可以使用如下 sum(ABS(A)) OVER (PARTTION BY DATE)/NULLIF (sum(ABS(B)) OVER (PARTTION BY DATE))。你能指导一下吗?
  • @smp97 这样的用例语句case when sum_of_b > 0 then sum_OF_A/sum_of_b else .... end as average
猜你喜欢
  • 2021-06-04
  • 2021-12-23
  • 2022-10-20
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多