Py学习  »  DATABASE

将mysql查询转换为hive

Suvrat Dharmadhikari • 6 年前 • 1670 次点击  

这个问题已经有了答案:

我正在尝试将以下mysql查询转换为hive

MySQL查询

SELECT
    departments.dept_name,
    dept_emp.dept_no,
    gender,
    (count(*)/(select count(*) from employees)) AS Sex
FROM 
    employees,
    dept_emp,departments
WHERE 
    dept_emp.dept_no = departments.dept_no
    AND dept_emp.emp_no =  employees.emp_no
GROUP BY 
    dept_emp.dept_no, 
    departments.dept_name,
    gender
ORDER BY 
    dept_emp.dept_no;

蜂箱查询

WITH 
    q1 as (SELECT COUNT(*) AS TOTAL_COUNT FROM employees),
    q2 as (SELECT gender,COUNT(*) as gender_count FROM employees GROUP BY gender)
SELECT 
    departments.dept_name,
    dept_emp.dept_no,
    gender,
    gender_count/TOTAL_COUNT As Sex 
FROM 
    q1,
    q2,
    dept_emp,
    departments
WHERE 
    dept_emp.dept_no = departments.dept_no
    AND dept_emp.emp_no = dept_emp.emp_no
GROUP BY 
    dept_emp.dept_no, 
    departments.dept_name,
    q2.gender
ORDER BY 
    dept_emp.dept_no;

但是我出错了

SemanticException[错误10025]:行3:53表达式不在 GROUP BY 关键: TOTAL_COUNT

提前谢谢!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31475
 
1670 次点击  
文章 [ 2 ]  |  最新文章 6 年前
leftjoin
Reply   •   1 楼
leftjoin    6 年前

实际上,通过使用 MAX() 对不在group by中的列进行聚合,或将它们添加到 group by . 我完全同意@gmb关于显式联接的观点,并且希望补充一点,您可以消除交叉联接和 employee 表使用分析进行额外扫描 count() :

SELECT
    d.dept_name,
    de.dept_no,
    e.gender,
    count(*)/max(e.total_cnt)  as Sex
FROM 
    (select emp_no, gender, 
            count(*) over() as total_cnt
       from employees e ) e
    INNER JOIN dept_emp de ON de.emp_no =  e.emp_no
    INNER JOIN departments d ON de.dept_no = d.dept_no
GROUP BY 
    de.dept_no, 
    d.dept_name,
    e.gender
ORDER BY 
    de.dept_no;
GMB
Reply   •   2 楼
GMB    6 年前

除了在 GROUP BY 子句,新查询中的逻辑似乎与旧查询中的逻辑不同(例如:子查询 q2 计算新内容…并且没有与其他表的联接条件)。

配置单元不支持中的子查询 SELECT 条款,但它 does allow them in FROM and WHERE clauses . 我只需将内联子查询移动到 条款。因为它只返回一条记录,所以 CROSS JOIN :

SELECT
    d.dept_name,
    de.dept_no,
    e.gender,
    (count(*)/x.cnt) AS Sex
FROM 
    employees e
    INNER JOIN dept_emp de ON de.emp_no =  e.emp_no
    INNER JOIN departments d ON de.dept_no = d.dept_no
    CROSS JOIN (SELECT COUNT(*) cnt FROM employees) x
GROUP BY 
    de.dept_no, 
    d.dept_name,
    e.gender
ORDER BY 
    de.dept_no;

NB1:总是使用 明确的 标准 JOIN 而不是旧的学校, 隐性的 加入 s;我相应地修改了查询(还添加了表别名)。