【问题标题】:HIVE multiple group by and minus operationHIVE 多重分组和减法操作
【发布时间】:2016-04-25 07:37:48
【问题描述】:

我正在尝试加入这两个关于 id 和 playerID 以及 year 和 yearID 的选择语句(下面的模式)。还要减去别名 HAB - EG 还要在两个选择语句中按年份和 id 分组,以便在稍后在层次结构中执行除法和减法之前对这些值求和。当我尝试这个时,它说按 G 分组,看起来很奇怪。我不需要按 G 分组,只需要按 id 和 year 分组,因为一个玩家可以在表格中有多个条目,我们需要在计算之前将 G、E H 和 AB 相加

  Try this:

SELECT
    a.playerID AS ID,
    a.yearID AS yearID,
    (b.HAB - a.EG) AS `HAB-EG`
FROM 
    (SELECT
        SUM(playerID),
        SUM(yearID),
        (E/G) AS EG
    FROM fielding
    WHERE (
            yearID > 2005
            AND yearID < 2009
            AND G > 20 
            )GROUP BY playerID,yearID
    ) AS a
JOIN
    (SELECT
        SUM(id),
        SUM(year),
        (hits/ab) AS HAB
    FROM batting
    WHERE( 
            year > 2005
            AND year < 2009 
            AND ab > 40 
            ) GROUP BY id,year

    ) AS b ON a.playerID = b.id AND a.yearID = b.year;

只是模式

CREATE EXTERNAL TABLE IF NOT EXISTS fielding
(playerID STRING ,yearID INT ,teamID STRING ,lgID STRING ,
POS STRING ,G INT ,GS INT , InnOuts INT , PO INT,A INT, E INT,  
DP INT , PB INT , WP INT ,SB INT ,CS INT , ZR INT ) ROW
FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION      '/home/hduser/hivetest/fielding';

只是模式

 CREATE EXTERNAL TABLE IF NOT EXISTS batting(id STRING, year INT, team STRING,
 league STRING, games INT, ab INT, runs INT, hits INT, doubles INT, triples
 INT, homeruns INT, rbi INT, sb INT, cs INT, walks INT, strikeouts INT, ibb
 INT, hbp INT, sh INT, sf INT, gidp INT) ROW FORMAT DELIMITED FIELDS
 TERMINATED BY ',' LOCATION '/home/hduser/hivetest/batting';

【问题讨论】:

  • 您的分组似乎已关闭。您有兴趣按非聚合值分组。例如。 SELECT id, sum(value) GROUP BY id.
  • ..also - 为什么要按年份分组?您是在获得每位玩家每年的比例,还是仅获得每位玩家的总比例?
  • Ahhhh abs right...我的这种公然错误
  • 嗯,你说得对,我只是假设我需要按年份分组以说明任何给定玩家可能的多条记录。我的错误只是一个玩家组就足够了

标签: hadoop hive


【解决方案1】:

试试这个:

SELECT
    a.playerID AS ID,
    a.yearID AS yearID,
    (b.HAB - a.EG) AS `HAB-EG`
FROM 
    (SELECT
        playerID,
        yearID,
        (SUM(E)/SUM(G)) AS EG
    FROM fielding
    WHERE (
            yearID > 2005
            AND yearID < 2009
            AND G > 20 
            )GROUP BY playerID,yearID
    ) AS a
JOIN
    (SELECT
        id,
        year,
        (SUM(hits)/SUM(ab)) AS HAB
    FROM batting
    WHERE( 
            year > 2005
            AND year < 2009 
            AND ab > 40 
            ) GROUP BY id,year

    ) AS b ON a.playerID = b.id AND a.yearID = b.year;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-11-22
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多