❶ 如何查看hivesql里执行了哪些查询
思路
当我们在终端下执行命令“hive”后,会看到有如下输出:
Hive有会话(Session)的概念,而这次会话中的所有日志消息将会输出到这个日志文件中,包含SQL语句的执行日志,查看这个日志文件可以看到以下信息:
❷ hive sql里,帮我描述一个简单的sql的原理
select a.id,a.info,b.num from a join b on a.id=b.id and where b.num>=10
两个表做关联,首先where会过滤掉不需要的数据。
至于表怎么做map和rece操作,在hive里的表是虚拟的,其实还是对hdfs文件进行操作,你可以在hdfs:///user/hive/warehouse路径下找到以表名来命名的文件,里面就是表的内容,可以执行-cat命令查看。所以,它的map操作很简单,就是按行读文件,然后会根据hive的默认分隔符\001对每行进行切分。切分完成后就会按照你SQL指定的逻辑进行合并,最后再输出成hdfs文件,只不过在hive里面看它是以表的形式展现的。
job数会在你执行sql语句之后紧接着有相应的日志记录,
Total MapRece jobs = 2
Launching Job 1 out of 2
Number of rece tasks not specified. Estimated from input data size: 2
In order to change the average load for a recer (in bytes):
set hive.exec.recers.bytes.per.recer=<number>
In order to limit the maximum number of recers:
set hive.exec.recers.max=<number>
In order to set a constant number of recers:
这样就是有两个job,正在执行第一个job。
Hadoop job information for Stage-1: number of mappers: 5; number of recers: 2
而这个就会告诉你有多少个mapper和recer。
像你写的这个sql有join操作,而且是hiveSQL里面最普通的join,那么一定会有recer参与,如果数据量很大,比如上千万条记录,join就会特别慢,job进度就会一直卡在rece操作。可以改成mapjoin或者sort merge bucket mapjoin。
其实hive效率不高,不适合实时查询,即使一个表为空,用hive进行查询也会很耗时,因为它要把sql语句翻译成MR任务。虽然简化了分布式编程,但是效率上就会付出代价。
你的这句sql应该会翻译成一个JOB来执行,就是简单地map和rece。
maprece就是按行读文件,然后切分,合并,输出成文件。
❸ sql语句 同时查询两个表
sql多表关联查询跟条件查询大同小异,主要是要知道表与表之前的关系很重要;举例说明:(某数据库中有3张表分别为:userinfo,dep,sex)
userinfo(用户信息表)表中有三个字段分别为:user_di(用户编号),user_name(用户姓名),user_dep(用户部门) 。(关系说明:userinfo表中的user_dep字段和dep表中的dep_id字段为主外键关系,userinfo表中的user_sex字段和sex表中的sex_id字段为主外键关系)
❹ 求问 hadoop +hive ,怎么通过hive的sql实现分页查询(分批查询)。
简单的办法是按小时分区,之后一次取一小时
❺ hive sql 将两张表连接成为第三张表
SELECT a.* FROM a JOIN b ON (a.id = b.id);
建议看看官方wiki:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins
❻ hive如何同时执行多段sql
hive sql放到文件当中,之后 hive -f filename执行
❼ hive 多表插入出问题,from 后接子查询
应该是:
from (select * from ...) a join (select * from ....) b on (a.key=b.key)
❽ 使用hive sql 连接表查询时,会产生中间表,这些中间表这怎么存储的
没明白你说的,但是我想应该是这样!
有三张表。 学生、课程、老师
s(sid、sname、sex、age) 代表 学生(学生号、姓名、性别、年龄)
c(cid、sid 、cname、grade) 课程(课程号、学生号、课程名、成绩)
t(tid、tname、cid) 老师 (教师号、教师姓名、课程号)
select * from student,course,teacher
where s.sid = c.sid and c.cid = t.cid ;
三表连接就完成了。
当然还有其他方式建立三表连接。我这种方式最简单直观了。
希望对你有帮助!
❾ hive sql 优化的常用手段有哪些
1、join连接时的优化:当三个或多个以上的表进行join操作时,如果每个on使用相同的字段连接时只会产生一个maprece。
2、join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算
3、在where字句中增加分区过滤器。
4、当可以使用left semi join 语法时不要使用inner join,前者效率更高。原因:对于左表中指定的一条记录,一旦在右表中找到立即停止扫描。