???题目汇总
1.(单选题,3.0分)以下说法中不正确的是(B )。
A.HIVE中create table命令使用时,表类型可以存储为ORC。
B.HIVE中create table命令使用时,必须包含row format delimited。
C.HIVE中create table命令使用时若含row format delimited,则这句应放在限制语句的第一条
D.HIVE中create table命令使用时,行与行的间隔符只能是\n。
正确答案是B。在HIVE中,create table命令使用时,并不一定必须包含row format delimited。这个子句是用来指定表的行格式,如果不指定,默认使用文本格式。因此,可以创建不包含row format delimited的表,但在处理某些特殊格式的数据时,这个子句可能会很有用。
2.(单选题,3.0分)将本地/data/tmp.txt导入到表tv,采用load指令后,/data/tmp.txt是否还存在?(?A)
A.存在
B.不能确定
C.不存在
A.正确。当使用load data local inpath命令时,Hive会将本地文件复制到HDFS的目标表中,而不会删除本地文件。所以,/data/tmp.txt仍然存在于本地文件系统中。
3.(单选题,5.0分)当发现hive脚本执行时报错信息中包含如下内容:
FAlLEDSClassCastExceptionorg.apache.hadoop.hive.serde2.typeinfo.PrimitiveTIypelnfocannotbecasttoorg.apache.hadoop.hive.serde2.typeinfo.DecimalTypelnfo 则此脚本最可能存在的问题是什么?(B?)
A.网络问题
B.字符串和数值类型转换错误
C.GROUP BY中包含详单的字段(字段重复)
D.hive-site配置出错
B正确。这个错误是由于字符串和数值类型转换错误导致的。可能是在创建表或者查询表的时候,指定了错误的数据类型,或者使用了错误的分隔符。
4.(单选题,5.0分)关于HIVE SQL基本操作描述正确的是(?C)
A.一旦表创建好,不可再修改列名
B.一旦表创建好,不可再修改表名
C.创建外部表时需要指定external关键字
D.一旦表创建好,不可再增加新列。
A.错误。Hive中可以使用alter table命令来修改表的列名。例如,如果想把表stu的列name改为student_name,可以这样写:
alter table stu change name student_name string;
B.错误。Hive中可以使用alter table命令来修改表的名字。例如,如果想把表stu改为student,可以这样写:
alter table stu rename to student;
C.正确。Hive中创建外部表时需要指定external关键字。外部表的特点是,当删除表时,只会删除表的元数据,而不会删除表的数据。例如,如果想创建一个外部表student,并指定其数据的位置,可以这样写:
create external table student (id int, name string)
location '/user/student';
D.错误。Hive中可以使用alter table命令来增加新列。例如,如果想给表student增加一个score列,可以这样写:
alter table student add columns (score int);
所以,正确答案是C。
5.(单选题,3.0分)
Hive是由哪家公司开发的开源大数据处理组件(D )。
A.Apache
B.Amazon
C.Google
D.Facebook
Hive是基于Hadoop的数据仓库工具
D.正确。Hive是由Facebook开源的,用于解决海量结构化日志的数据统计工具。
所以,正确答案是D。
6.(单选题,3.0分)关于Hive与传统关系型数据库的对比,错误的是(?A)
A.由于Hive基于大数据平台,所以查询效率比传统数据库快
B.传统关系型数据库的索引机制发展的非常成熟,而Hive的索引机制还很低效
C.由于Hive的数据存储在HDFS中,所以可以保证数据的高容错、高可靠
D. Hive基于HDFS存储,理论上存储量可无限扩展,而传统数据库存储量有上限
A.错误。Hive并不比传统数据库查询效率快,因为Hive是基于MapReduce引擎的,而MapReduce引擎是适合批量处理大规模数据的,而不是适合实时查询的。Hive的查询延迟比传统数据库高很多。
B.正确。传统关系型数据库的索引机制确实发展的非常成熟,而Hive的索引机制还很低效。Hive的索引只能加速部分查询,而且需要用户手动创建和维护。传统数据库的索引可以自动创建和优化,而且可以支持多种查询类型。
C.正确。Hive的数据存储在HDFS中,所以可以保证数据的高容错、高可靠。HDFS是一个分布式文件系统,它可以将数据分块存储在多个节点上,并且提供数据的备份和恢复机制 。传统数据库的数据存储在本地文件系统中,如果文件系统损坏或者节点故障,数据可能会丢失或者不可用。
D.正确。Hive基于HDFS存储,理论上存储量可无限扩展,而传统数据库存储量有上限。HDFS是一个可扩展的文件系统,它可以通过增加节点来增加存储空间 。传统数据库的存储空间受到单个节点的硬件限制,如果要扩展存储空间,需要更换更大的硬盘或者使用更复杂的分布式数据库架构。
所以,正确答案是A。
7.(单选题,2.0分)下列哪种结构不属于HIVE的存储结构(A?)。
A.分区
B.桶表
C.外部表
D.分区表
hive的存储结构
1.数据仓库:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
2.表:hive的表分为内部表、外部表、分区表、分桶表,表在hdfs中的表现形式也是目录,
但是不同的表之间的表现形式不同
3.视图:物化,hive是不会进行物化,相当于给一个sql语句建立了一个快捷方式,保存的是一个视图中的sql语句。只读,基于基表创建。
4.数据文件 :表中的真实数据
所以选A
8.(单选题,3.0分)Hive中要想支持事务功能,则表类型应存储成类型(B )。
A.可以是ORC
B.必须是ORC
C.必须是textfile
D.可以是tar.gz
B.正确。Hive中支持事务功能的表类型必须是ORC,因为ORC格式具有优化的行列存储、压缩、索引等特性,能够提高事务表的查询和更新性能。Hive中创建事务表时,需要指定stored as orc。
D.错误。Hive中支持事务功能的表类型不能是tar.gz,因为tar.gz格式不支持ACID语义。tar.gz格式是一种压缩文件格式,它不是Hive的内置存储格式,需要使用自定义的SerDe和InputFormat/OutputFormat来读写。
9.(单选题,3.0分)将hdfs中/data/tmp.txt通过load指令加载到表tc中,源文件/data/tmp.txt是否在存在?(A )
A.不存在
B.不能确定
C.存在
A.正确。当使用load data inpath命令时,Hive会将HDFS文件移动到目标表中,而不会复制。所以,/data/tmp.txt在加载到表tc后就不存在了。
C.错误。当使用load data local inpath命令时,Hive会将本地文件复制到HDFS的目标表中,而不会删除本地文件。所以,如果/data/tmp.txt是本地文件,那么它就仍然存在。但是,如果/data/tmp.txt是HDFS文件,那么它就不存在了。
所以,正确答案是A
10.(单选题,2.0分)
Hive定义一个自定义函数类时,需要继承以下哪个类(?A)
A.UDF
B.HQL
C.FunctionRegistry
D. MapReduce
A.正确。Hive中自定义函数有三种类型:UDF(一对一的输入输出),UDAF(多对一的输入输出),UDTF(一对多的输入输出)。如果想定义UDF类型的自定义函数,需要继承UDF类,并实现evaluate方法。
B.错误。HQL是Hive查询语言,不是一个类,也不是用来定义自定义函数的。
C.错误。FunctionRegistry是Hive的函数注册类,用来管理Hive的内置函数和自定义函数,不是用来定义自定义函数的。
D.错误。MapReduce是Hadoop的分布式计算框架,不是一个类,也不是用来定义自定义函数的。
所以,正确答案是A。
11.(单选题,3.0分)
不属于Hive的优点是(B )
A.提供与SQL相近的语法,容易上手,可以非常容易地完成数据的ETL。
B.适用于海量结构化数据分析汇总,查询速度非常快。
C.适合处理结构化的数据。
D.存储格式灵活多样,有较强的扩展性。
A.错误。Hive提供了类似SQL的查询语言,叫做HQL或者HiveQL,这使得它易于使用和学习。Hive也可以用来完成数据的ETL(提取、转换、加载),将数据从不同的源导入到Hive中,进行转换和分析,然后导出到其他的目的地。
B.正确。Hive适用于海量结构化数据的离线分析,但是查询速度并不非常快。Hive的查询是基于MapReduce引擎的,而MapReduce引擎是适合批量处理大规模数据的,而不是适合实时查询的 。Hive的查询延迟比传统数据库高很多 。
C.错误。Hive适合处理结构化的数据,这是Hive的一个基本要求。Hive可以将结构化的数据文件映射为一张数据库表,然后使用HQL来查询和分析 。Hive不支持非结构化或半结构化的数据,如图片、视频、音频、JSON、XML等 。
D.错误。Hive的存储格式灵活多样,有较强的扩展性。Hive支持多种存储格式,如TEXTFILE, SEQUENCEFILE, ORC, PARQUET等 ,并且可以自定义SerDe(序列化和反序列化)和InputFormat/OutputFormat来读写其他格式的数据 。
所以,正确答案是B。
12.(单选题,5.0分)下列哪种方法可以实现IN/EXISTS子查询(B )。
A. left join
B.left semi join
C.right join
D.join
A.错误。left join是一种连接操作,它可以将左表的所有记录和右表的匹配记录合并在一起,不匹配的记录用NULL填充。left join不能直接实现IN/EXISTS子查询,但可以通过添加过滤条件来模拟。
B.正确。left semi join是一种特殊的连接操作,它只返回左表中和右表匹配的记录,不返回右表的任何列。left semi join可以直接实现IN/EXISTS子查询,而且比left join更高效。
C.错误。right join是一种连接操作,它可以将右表的所有记录和左表的匹配记录合并在一起,不匹配的记录用NULL填充。right join不能直接实现IN/EXISTS子查询,但可以通过添加过滤条件来模拟。
D.错误。join是一种连接操作,它可以将两个表的匹配记录合并在一起,不匹配的记录被丢弃。join不能直接实现IN/EXISTS子查询,但可以通过添加过滤条件来模拟。
所以,正确答案是B。
13.(单选题,2.0分)关于HIVE SQL运行原理,描述正确的是(B )
A.对于select count(*) from table操作,不会启动mapreduce任务
B.DDL语句不提交任务到mapreduce,而是直接操作元数据
C.对于select * from table语句,不会启动mapreduce.
D.所有的HQL都会转化为mapreduce任务执行
A.错误。对于select count(*) from table操作,会启动mapreduce任务。因为Hive需要扫描整个表的数据,然后在map阶段输出每个分区的记录数,再在reduce阶段对所有分区的记录数求和,得到最终的结果。
B.正确。DDL语句不提交任务到mapreduce,而是直接操作元数据。因为DDL语句只涉及到表的结构信息,不涉及到表的数据内容,所以不需要使用mapreduce进行计算,只需要更新元数据即可。
C.错误。对于select * from table语句,会启动mapreduce任务。因为Hive需要扫描整个表的数据,然后在map阶段输出每条记录,再在reduce阶段将所有记录合并,得到最终的结果。
D.错误。并不是所有的HQL都会转化为mapreduce任务执行。有些HQL可以直接从元数据或者HDFS中获取结果,不需要使用mapreduce进行计算,例如show tables, describe table, load data等。
所以,正确答案是B
14.(单选题,3.0分)关于HIVE与HADOOP其他组件的关系,描述错误的是(D )。
A.HIVE是HADOOP平台的数据仓库工具。
B.HIVE最终将数据存储在HDFS中。
C.HIVE SQL其本质是执行MAPREDUCE任务。
D.HIVE对HBASE有强依赖。
A.错误。HIVE是HADOOP平台的数据仓库工具,这是正确的。HIVE可以将结构化的数据文件映射为一张数据库表,并提供类似于SQL的查询语言,能将SQL语句转换为MapReduce任务来执行。
B.错误。HIVE最终将数据存储在HDFS中,这也是正确的。HIVE的数据都是存储在Hadoop的分布式文件系统HDFS中,HDFS为海量的数据提供了存储,而MapReduce为海量的数据提供了计算。
C.错误。HIVE SQL其本质是执行MAPREDUCE任务,这同样是正确的。HIVE的查询是基于MapReduce引擎的,而MapReduce引擎是适合批量处理大规模数据的,而不是适合实时查询的。HIVE将用户提交的SQL解析成MapReduce任务供Hadoop直接运行。
D.正确。HIVE对HBASE有强依赖,这是错误的。HIVE和HBASE是两个不同的组件,HIVE是一个数据仓库工具,HBASE是一个分布式的列式数据库 。HIVE和HBASE可以相互配合,但不是必须的 。HIVE可以通过HBaseStorageHandler来访问HBASE中的数据,但也可以访问其他类型的数据源 。
所以,正确答案是D
15.(单选题,5.0分)使用load data inpath '/data/s1.txt into table student指令装载数据后,文件s1.txt是否还在之前的存储位置(A )
A.不存在
B.不确定
C.还存在
A.正确。当使用load data inpath命令时,Hive会将HDFS文件移动到目标表中,而不会复制。所以,/data/s1.txt在加载到表student后就不存在了。
所以,正确答案是A。
16.(单选题,5.0分) select distinct(sid) from student是否启动MR?(?A)
A.必须启动
B.可以不启动
C.不启动
A.正确。select distinct(sid) from student是一个聚合查询,它需要对student表中的sid列进行去重和统计。这个操作需要启动MapReduce任务,因为Hive需要在map阶段对每个分区的sid列进行去重,然后在reduce阶段对所有分区的结果进行合并,得到最终的结果。
所以,正确答案是A。
17.(单选题,5.0分)
create table bigdata22.student100(sno int, sname string, sage int, saddr string)
row format delimited
fields terminated by ','
lines terminated by '\n';
create table bigdata22.course100(cno int, cname string, ccredit int)
row format delimited
fields terminated by ';'
lines terminated by '\n';
create table bigdata22.SC100(sno int, cno int, grade int)
row format delimited
fields terminated by ','
lines terminated by '\n';
则执行select student100.sno,sname,sage,saddrfrom SC100 left semi join?student100on (SC100.sno=student100.sno);的结果是(?B)
A. student100和SC100的自然连接
B.出错
C. student100和SC100的笛卡尔积
D. student100和SC100的嵌套查询
A.错误。student100和SC100的自然连接是指将两个表中相同列名的列进行等值连接,然后去除重复的列。而left?semi?join是一种特殊的连接操作,它只返回左表中和右表匹配的记录,不返回右表的任何列。所以,这两种操作的结果是不同的。
B.正确。这个查询语句会出错,因为select子句中的sname,?sage,?saddr列都是来自右表student100的,而left?semi?join的限制是右表只能在on子句中设置过滤条件,不能在select子句中出现。所以,这个查询语句是非法的,会报错说Invalid?table?alias?or?column?reference?'sname'。
C.错误。student100和SC100的笛卡尔积是指将两个表中的每一条记录都和另一个表中的每一条记录进行连接,得到的结果集的大小是两个表的大小的乘积。而left?semi?join是一种特殊的连接操作,它只返回左表中和右表匹配的记录,不返回右表的任何列。所以,这两种操作的结果是不同的。
D.错误。student100和SC100的嵌套查询是指将一个查询的结果作为另一个查询的输入,通常使用in,?exists,?not?in,?not?exists等操作符1。而left?semi?join是一种特殊的连接操作,它只返回左表中和右表匹配的记录,不返回右表的任何列23。所以,这两种操作的结果是不同的。
所以,正确答案是B。
18.(单选题,5.0分)select count(*) from ah16_part是否会启动MAPREDUCE?(?C)
A.不一定启动MR
B.不确定
C.必须启动MR
D.调优后,可以不启动MR
A.错误。select count(*) from ah16_part是一个聚合查询,它需要对ah16_part表中的所有记录进行计数。这个操作需要启动MapReduce任务,因为Hive需要在map阶段对每个分区的记录数进行输出,然后在reduce阶段对所有分区的记录数求和,得到最终的结果。
B.错误。select count(*) from ah16_part是否会启动MapReduce任务是可以确定的,不会出现不确定的情况。所以,这个选项是错误的。
C.正确。select count(*) from ah16_part必须启动MapReduce任务,因为它是一个聚合查询,而不是一个简单的选择查询。Hive不能直接从HDFS中获取结果,而需要使用MapReduce进行计算。
D.错误。select count(*) from ah16_part即使调优后,也不能不启动MapReduce任务,因为它是一个聚合查询,而不是一个简单的选择查询。Hive不能直接从HDFS中获取结果,而需要使用MapReduce进行计算。调优只能提高MapReduce任务的性能,但不能避免MapReduce任务的启动 。
所以,正确答案是C。
19.(单选题,5.0分)使用load data inpath指令装载数据时,文件所在的存储位置在(D )
A.不确定
B.根据具体的参数来定
C.本地虚拟机
D.HDFS
如果不包含LOCAL关键字,则从HDFS文件系统加载数据,文件路径必须是绝对路径。
20.(单选题,5.0分)以下哪个指令用于将本地文件上传到hdfs?(?B)
A. mv
B.put
C.cp
D. get
A.错误。mv命令是用于移动或重命名文件或目录的,不是用于将本地文件上传到hdfs的。例如,mv file1 file2可以将file1重命名为file2,mv file1 /dir1可以将file1移动到dir1目录下。
B.正确。put命令是用于将本地文件上传到hdfs的,可以指定本地文件路径和hdfs文件路径。例如,hdfs dfs -put test.txt /user/hadoop可以将本地的test.txt文件上传到hdfs的/user/hadoop目录下。
C.错误。cp命令是用于复制文件或目录的,不是用于将本地文件上传到hdfs的。例如,cp file1 file2可以将file1复制为file2,cp file1 /dir1可以将file1复制到dir1目录下。
D.错误。get命令是用于将hdfs文件下载到本地的,不是用于将本地文件上传到hdfs的。例如,hdfs dfs -get /user/hadoop/test.txt test.txt可以将hdfs的/user/hadoop/test.txt文件下载到本地的test.txt文件。
所以,正确答案是B。
21.(单选题,5.0分)下面哪个操作可以使得表student1有一个对应的可见存储文件夹?(?C)
A. create table student1(sid int) location '/data/mydb.db';
B.create table student1(sid int) location '/data';
C. create external table student1(sid int) location 'mydb.db/student1';
D.create external table student1(sid int) location '/data';
A.错误。create table student1(sid int) location ‘/data/mydb.db’是创建一个内部表,并指定其存储位置为’/data/mydb.db’。这个操作不会在HDFS中创建一个对应的可见存储文件夹,而是在元数据中记录表的位置信息。如果删除这个表,HDFS中的数据也会被删除。
B.错误。create table student1(sid int) location ‘/data’是创建一个内部表,并指定其存储位置为’/data’。这个操作不会在HDFS中创建一个对应的可见存储文件夹,而是在元数据中记录表的位置信息。如果删除这个表,HDFS中的数据也会被删除。
D. create external table student1(sid int) location '/data';
选项D不是不正确,但它给出的信息不够明确。这个命令创建了一个名为`student1`的外部表,并指定了其位置为`/data`。当创建外部表时,Hive确实会使用指定的路径作为该表数据的存储位置,这意味着`student1`表的数据会存储在`/data`目录下。
然而,问题是在问哪个操作可以使得表`student1`有一个对应的可见存储文件夹。从字面上理解,我们通常期望每个表都有自己独立的存储文件夹,避免与其他表共享。选项D中的`/data`可能看起来像是一个共用的数据目录,而不是专门为`student1`表定制的目录。如果多个表指定相同的`location`路径,它们将会共享相同的存储空间,这可能会导致数据管理上的混乱。
因此,在考虑到最佳实践和表的独立存储需求时,选项C提供了一个更明确的、专门为`student1`表创建的存储路径,因此更符合问题的要求。选项D在实际使用中可能会导致数据管理上的问题,除非在其他上下文中明确指出`/data`目录专门用于`student1`表的数据存储。在没有这样的上下文的情况下,选项C是更合适的选择。
22.(单选题,5.0分) select greatest(tt,jb,jx) from sal?是否会启动MR?(B )
A.必须启动
B.不启动
可以理解为 greatest函数 是 比较大小,其实还是简单查找
23.(单选题,5.0分)
create view viewdb1 as
select dname,
count(*)?count_numbe,
sum(if(gender=='男',1,0))M,sum(if(gender=='女',1,0))F
from tb_case
group by dname ;
此时执行select * from viewdb1是否会启动MR?(A )
A.会
B.不会
A.正确。select?*?from?viewdb1是一个视图查询,它会根据视图的定义语句来执行相应的操作。因为视图viewdb1的定义语句中包含了聚合函数和分组操作,所以它需要启动MapReduce任务,因为Hive需要在map阶段对每个分区的gender列进行统计,然后在reduce阶段对所有分区的结果进行合并,得到最终的结果。所以,正确答案是A。
24.(单选题,5.0分)
create table A(id string, pos int)
row format delimited
fields terminated by ',';
create table B(id string, name string)
row format delimited
fields terminated by ',';
vi A.txt
a,1
b,2
c,3
d,4
e,5
f,6
g,7
vi B.txt
a,name1
b,name2
c,name3
d,name4
load data local inpath '/data/A.txt' overwrite into table A;
load data local inpath '/data/B.txt' overwrite into table B;
则执行
select * from B
left join A on (A.id=B.id);执行结果是(A )
A.
a ?name1 ??a ?1
b ?name2 ??b ?2
c ?name3 ??c ?3
d ?name4 ??d ?4
B.
a name1
b name2
c name3
d name4
C.
a 1 a name1
b 2 b name2
c 3 c name3
d 4 d name4
e 5 NULL NULL
f 6 NULL NULL
g 7 NULL NULL
A.正确。select * from B left join A on (A.id=B.id)是一个左外连接查询,它会返回左表B的所有记录,以及右表A中与on条件匹配的记录,不匹配的记录用NULL填充。因为B表和A表中的id列都有相同的值a,b,c,d,所以这四行都能匹配,并显示出来。B表中没有其他的记录,所以不会显示NULL。所以,这个选项是正确的。
C.错误。select * from B left join A on (A.id=B.id)是一个左外连接查询,它会返回左表B的所有记录,以及右表A中与on条件匹配的记录,不匹配的记录用NULL填充。这个选项显示了A表的所有记录,以及B表中与on条件匹配的记录,不匹配的记录用NULL填充,这相当于一个右外连接查询,而不是一个左外连接查询,所以这个选项是错误的。
所以,正确答案是A
25.(单选题,5.0分)
select
dname ,
count(*) count_numbe,
sum(if(gender=='男',1,0))M,
sum(if(gender== '女',1,0))F
from
tb_case
group by dname ;
请问查询的字段是几个?(B )
A.3
B.4
C.5
D.6
B.正确。查询的字段是4个。查询的字段是指select子句中列出的列或表达式,不包括group by子句中的列。在这个查询中,select子句中有四个字段:dname, count(*), sum(if(gender==‘男’,1,0))和sum(if(gender==‘女’,1,0))。
所以,正确答案是B
剩下题目在下期,敬请期待