mysql - 将 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
先感谢您!
解决方案
除了子句中缺少非聚合列的错误之外,GROUP BY
新查询中的逻辑似乎与旧查询中的逻辑不同(例如:子查询q2
计算新的东西......并且没有与其他表的连接条件)。
Hive 不支持SELECT
子句中的子查询,但它允许它们出现在 FROM
andWHERE
子句中。我只是将内联子查询移动到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
的;我相应地修改了查询(并且还添加了表别名)。
推荐阅读
- c++ - what() const throw 是什么意思?
- javascript - 组件未在 reactJS 中呈现
- azure-devops - Azure Devops 构建管道在构建解决方案等步骤上失败
- docker - iRedmail 作为反向代理在另一个 nginx 后面的 docker 容器中运行
- javascript - Redux 布尔状态更改但未在组件中呈现
- javascript - 在哪里调用 setState 以正确更新道具
- python - TypeError:计算 f1_score 时,只有 size-1 数组可以转换为 Python 标量
- c - Valgrind 神秘的无效写入大小为 8 错误
- python - 如何使用 Python 格式化字符串
- java - Spring JPA:瞬态不与 ElementCollection 一起使用