首页 > 解决方案 > 将 MySQL 查询转换为 Hive

问题描述

我正在尝试将以下 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

先感谢您!

标签: mysqlsqlhive

解决方案


除了子句中缺少非聚合列的错误之外,GROUP BY新查询中的逻辑似乎与旧查询中的逻辑不同(例如:子查询q2计算新的东西......并且没有与其他表的连接条件)。

Hive 不支持SELECT子句中的子查询,但它允许它们出现在 FROMandWHERE子句中。我只是将内联子查询移动到FROM子句。因为它只返回一条记录,那将是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的而不是老式的、隐式 JOIN的;我相应地修改了查询(并且还添加了表别名)。


推荐阅读