26.(单选题,5.0分)
create?view viewdb1
as
select
name,
count(*) count_numbe,
sum(if(gender=='男',1,0))M,
sum(if(gender=='女',1,0))F,
from
student
group by name ;
请问执行该语句时,是否会启动MR?(B )
A.会
B.不会
创建不会启动,查找启动MR
27.(单选题,5.0分)假设bucktable2是一个桶表,则下面不能正确看到相关分桶信息的是(?A)
A. select * from bucktable2;
B. hadoop fs -cat /warehouse/home/owndb.db/bucktable2/000002_0
C.select * from bucktable2 tablesample(bucket 3 out of 4 on sid);
A使用select * from bucktable2;语句,可以查看桶表的所有数据,但是无法直接看出数据是如何分桶的。
B使用hadoop fs -cat /warehouse/home/owndb.db/bucktable2/000002_0命令,可以查看桶表的底层数据文件,其中000002_0表示第三个桶的第一个文件。这种方法可以看到桶表的数据结构,但是需要知道桶表的存储路径。
C使用select * from bucktable2 tablesample(bucket 3 out of 4 on sid);语句,可以对桶表进行抽样查询,其中bucket 3 out of 4 on sid表示从按照sid字段分为4个桶的桶表中,选择第三个桶的数据。这种方法可以直接看到桶表的分桶规则和数据分布。
28.(单选题,5.0分) update table student set sname='zhangsan' where sid=5的执行结果是(A )
A.出错
B.可以执行成功
Updata 只能在orc事务表桶表中使用
为了使UPDATE语句能够在Hive中执行,必须满足以下条件:
使用的是Hive的事务特性,需要设置hive.support.concurrency为true。
表必须是事务型表,即表需要设置为支持ACID(原子性、一致性、隔离性、持久性)操作。
必须使用ORC文件格式,并且在创建表时开启了事务特性(通过设置TBLPROPERTIES ('transactional'='true'))。
29.(单选题,5.0分)
(1) create view viewdb1as
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;
(2)
select
dname,
count(*) count_numbe,
sum(if(gender=='男',1,0))M,
sum(if(gender=='女',1,0))F
from
tb_case
group by dname ;
请问这两组执行指令的结果是一样吗?(A)
A.可能不一样
B.完全不一样
C.肯定一样
30.(单选题,5.0分)
alter table part_table add partition (gender='new')指令的作用是(?C)
A.在part_table的行级数据上增加了新的数据
B.给part_table增加一个分区字段,改变表的schema
c.在part_table增加一个子文件夹
alter table part_table add partition (gender='new')是一个用于向分区表中添加新分区的语句,它的作用是在part_table表中增加一个新的分区,分区字段是gender,分区值是new3。这个语句会在part_table表的存储路径下增加一个子文件夹,文件夹的名称是gender=new,文件夹中存放的是符合这个分区条件的数据。
因此,这个指令的作用是 在part_table增加一个子文件夹,答案是 C。
ALTER TABLE ... ADD PARTITION语句在Hive中用于向表中添加一个新的分区,而这个新分区通常是在表所在的HDFS文件系统中对应一个新的子文件夹。对于分区表,Hive会为每个独立的分区创建一个单独的文件夹,以便高效地进行数据管理和查询。因此,执行alter table part_table add partition (gender='new')指令会在part_table表的目录下创建一个新的子文件夹,通常以该分区的值命名(例如gender=new)。
这个操作并不会改变表的schema,也不会直接在行级数据上增加新的数据。只有当数据被载入这个新分区时,才算是向该分区添加了数据。
31.(单选题,5.0分)
select size(map(1, 'yom',2,'ff'))的运行结果是(C )
A.出错
B.3
C.2
D.4
select size(map(1, 'yom',2,'ff'))是一个查询语句,它的作用是返回map(1, 'yom',2,'ff')的元素个数12。因为map(1, 'yom',2,'ff')包含两个键值对,所以它的元素个数是2。
选C
32.(单选题,5.0分)如果使用hadoop fs -mv /data/t1.txt /hive,则执行命令之后/data/t1.txt这个源文件是否还存在?(B )
A.存在
B.不存在
hadoop fs -mv /data/t1.txt /hive是一个用于移动文件的命令,它的作用是将/data/t1.txt这个文件从/data目录下移动到/hive目录下。这个命令会改变文件的位置,但不会改变文件的内容或属性。
如果使用hadoop fs -mv /data/t1.txt /hive,则执行命令之后/data/t1.txt这个源文件不存在了,因为它已经被移动到了/hive目录下 。如果想要查看移动后的文件,可以使用hadoop fs -ls /hive命令,可以看到/hive/t1.txt这个文件。
选B
33.(单选题,5.0分)
select cast('2019-11-32' as date);的执行结果是(C )
A.出错
B.2019-11-31
C.NULL
D.2019-11-32
1.(填空题5.0分)查看HDFS中/warehousedir/home/mydata.db/t1/tmp.txt的内容。__(需要使用空格时请仅使用一个空格,HQL指令需要携带分号;否则影响答案正确性。)
hdfs?fs -cat /warehousedir/home/mydata.db/t1/tmp.txt
2.(填空题.5.0分)将HDFS中/data/tmp.txt内容采用覆盖写方式载入到数据表tv中。(需要使用空格时请仅使用一个空格,HQL指令需要携带分号;否则影响答案正确性。)
load data inpath ‘/data/tmp.txt’?overwrite into table tv;
3.(填空题,5.0分)请写出符合下列操作条件的表student2的创建语句。__
在本地的/data下vi student2.txt
2001,张三,语文:88#数学:90#英语:78
2002,tom, chinese:80#math:80#english:90
2003, jimmy,语文:80#数学:50
load data local inpath '/data/student2.txt' overwrite into table student2;
Create external table student2
(sid int ,sname string,scores map<string ,int>)
Row format delimited fields terminated by ‘,’
collection items terminated by '#'
map keys terminated by ':'
Line terminated by ‘\n’
location?'/data/student2.txt';
4.(填空题,5.0分)切换到/data目录下。__(1)_
在/data下创建新的目录bigdata20;_(2)_
(需要使用空格时请仅使用一个空格,HQL指令需要携带分号;否则影响答案正确性。)
5.(填空题,5.0分)本地文件/data/tmp.txt加载到hive数据表tb_test中,采用追加写方式。__(需要使用空格时请仅使用一个空格,HQL指令需要携带分号;否则影响答案正确性。)
load data local inpath '/data/tmp.txt' into table tb_test;
6.(填空题.5.0分)将HDFS下/mydata下的文件tmp.txt下载到本地/data下。___(需要使用空格时请仅使用一个空格,否则影响答案正确性。)
hdfs fs -get /mydata/tmp.txt /data
7.(填空题,5.0分)
create external table t1(sid int) location '/data/bigdata.db'后,
表t1在hdfs中的存储位置是_从hdfs的根目录开始写起。
/data/bigdata.db
7.(填空题,5.0分)将本地/data下的文件tmp.txt上传到HDFS的/mydata下。__(需要使用空格时请仅使用一个空格,否则影响答案正确性。)
hdfs fs -put /data/tmp.txt /mydata
9.(填空题,10.0分)
以ah16表为数据源,请给出HQL相关的查询语句完成以下功能:
将身高设为区间段: (,160cm]为A类,(160,170]为B类,其余为C类;查询不同性别的A,B,C的人数分为为多少人?
写出相应的HQL查询语句,注意不是结果,要求使用with t as子查询结构。
with t as (
??select sex,
??case
????when height <= 160 then 'A'
????when height > 160 and height <= 170 then 'B'
????else 'C'
??end as a
??from ah16
)
select sex, a, count(*) as num
from t
group by sex, a
10.(填空题,5.0分)查看本地/data下的tmp.txt的内容。_
cat /data/tmp.txt
1. HQL 语言中,删除一个表中所有数据,但保留表结构的命令是___B____。
A. DROP????B. DELETE???C. REMOVE???D. CLEAR
2. 要查询 wold_books 表中所有书名中以 “中国” 开头的书籍的author, 可用___D__。语句。
A. SELECT aothor FROM wold_books WHERE book_name=‘中国*’
B. SELECT aothor FROM wold_books WHERE book_name LIKE ‘中国*’
C.?SELECT aothor FROM wold_books WHERE book_name=‘中国%’
D. SELECT aothor FROM wold_books WHERE book_name LIKE ‘中国%’
3.?关于Hive中的桶说法不正确的是___A____。
A. 每个桶是一个目录. ??
B.?建表时指定桶个数,桶内可排序.
C. 数据按照某个字段的值Hash后放入某个桶中.
D. 桶表可以分为静态桶表和动态桶表
解释:桶是相对分区进行更细粒度的划分,物理上每个桶就是目录里的一个文件。分区是以字段的形式在表结构中存在,每个分区以文件夹的形式单独存在表文件夹的目录下。其他三个选项都是正确的,桶表可以在建表时指定桶个数和排序列,数据可以按照某个字段的值Hash后放入某个桶中,桶表可以分为静态桶表和动态桶表。
4. Hive 中的这条命令” ALTER TABLE employee ADD columns( columnl string).”是什么含义___C____。
A. 创建表 B. 删除表 C.添加列 ?D.?修改文件格式
5. Hive 不适用于以下哪个场景单选____D___。
A. 非实时分析,例如日析 B. 数据挖掘,例如用户分析,区域展示
C. 数据汇总,例如每天,每击数,点击排行 ?D.?实时在线数
解释:Hive 是一个基于 Hadoop 的数据仓库工具,主要用于处理大规模数据和进行数据分析。Hive 不支持联机事务处理(OLTP),也不提供实时查询功能。Hive 在大规模数据集上执行查询一般有分钟级的时间延迟。因此,Hive 不适合用于实时在线数的场景,而更适合用于非实时分析、数据挖掘和数据汇总等场景。
6. 关于hive 建表基本描述不正确的是___AD____。
A. 不可再修改表名 ???????????????????B. 可再增加新列
C. 创建外部表需要制定external 关键字 ?D.?不可再修改列名
Alter table B add columns(col string);
Alter table B change column col new string;
7. 不属于Hive的优点是___D_____。
A. 提供与SQL相近的语法,容易上手,可以非常容易地完成数据的ETL。
B. 适合处理结构化的数据。
C. 存储格式灵活多样,有较强的扩展性。
D. 适用于海量结构化数据分析汇总,查询速度非常快。
解释:因为 Hive 的执行延迟比较高,不适合用于实时分析。Hive 的本质是将 HQL 转换成 MapReduce 程序,而 MapReduce 任务启动过程需要消耗较长的时间。因此,Hive 的查询速度不是它的优势,而是它的缺点之一。
8. 以下哪个不是 Hive 自带的系统函数?___D____。
A. sum ?B. count ??C. avg ?D. UDF
UDF 是用户自定义函数的缩写,是一种可以扩展 Hive 功能的机制。Hive 自带的系统函数有两百多个,包括日期函数、字符串函数、数学函数、条件函数等。您可以使用 show functions 命令来查看系统自带的函数,或者使用 desc function 命令来查看某个函数的用法。
9. Hive是由哪家公司开发的开源大数据处理组件___C____。
A. Google ???B. Apache ??C. Facebook ??D. Amazon
10.Hive的计算引擎是____B___。
A. HQL B. mapreduce ??C.?HDFS D.SQL
解释:Hive是一个基于Hadoop的数据仓库工具,它的本质是将HQL(Hive查询语言)转换成MapReduce程序,然后在Hadoop集群上执行。
11.?在一个集群系统master,slave1,slave2中,在slave2上进行hadoop fs -ls /后看到的信息,
和在master上输入此命令,看到的信息是____A___
A.?一样的 ?B.?不一样的 ?C. 要视具体情况而定?
解释:因为 hadoop fs -ls / 命令是用来列出 HDFS 文件系统根目录下的目录和文件的,而 HDFS 是一个分布式文件系统,它将数据存储在多个节点上,但是对用户提供一个统一的视图。因此,无论在哪个节点上执行 hadoop fs -ls / 命令,都会看到相同的信息,即 HDFS 根目录下的内容。
12.?执行select round(78.392,-1)得到的结果是____D____
A.78.3 ???B. 78.4 ??C.0.0????D. 80.0
解释:因为 SQL 中的 round 函数可以对数值进行四舍五入,第二个参数表示要四舍五入的位数,如果是负数,表示在小数点左边的位数。例如,round(78.392,-1)表示对78.392进行一位四舍五入,即将个位数四舍五入,结果为80.0。
13.?假设bucktable是一个事先创建好的桶表,下列哪个操作可以实现数据的分桶存储___C_____。
A.?load data local inpath '/opt/data/buck.txt' overwrite into table bucktable;
B. load data local inpath '/opt/data/buck.txt' into table bucktable;
C. insert into bucktable select * from tmptable;其中tmptable的schema与bucktable一致;
D. insert into bucktable values select * from tmptable;
因为 Hive 中的分桶是将表的数据按照哈希函数的结果进行划分和存储的一种方式,需要在插入数据时进行哈希运算。使用 load data 命令只是将数据文件复制到分桶表的目录下,不会进行哈希运算,因此不会实现数据的分桶存储。使用 insert into 命令可以将查询结果按照分桶表的规则进行哈希运算,并存储到相应的桶文件中。注意,插入数据时要保证分桶表和源表的 schema 一致,否则会出现数据类型不匹配的错误。
14.?如果table是一个textfile类型的表格,可以对其实施的操作命令不可以是___B_____
A.?select????B. update????C. load?????D.?drop
因为 Hive 中的 textfile 类型的表格是一种基于行的存储格式,它不支持对数据进行修改或删除的操作。如果想要更新或删除 textfile 类型的表格中的数据,一种常用的方法是创建一个新的表格,将修改后的数据插入到新的表格中,然后删除旧的表格。
15.?.需要查看数据库db的存储位置可以使用的指令是____B____。
A.?show databases; ?B.?desc database db; ?C.?desc db; ??D.?desc formatted db;
解释:show databases;指令可以显示所有数据库的列表,desc db;指令可以显示数据库db中的所有表的列表,desc formatted db;指令是无效的,因为desc formatted只能用于表或分区,而不能用于数据库。
二、简单应用题,写出对应的HQL语句(共2小题,共30分)
1、假设HIVE数据库默认存储地址为master:9000:/warehousedir/home使用如下命令分别创建两个表格t1和t2,请写出t1和t2表格的存储文件地址。
create?database mydata location ‘/own/mydata.db’;
(1) use mydata; ?create table t1(sid int, sname string);---7分
(2) use mydata; ?create external table t2 (sid int, sname string) ?location ‘/mydata.db’;--8分
?????????
这是因为创建数据库mydata时指定了location为/own/mydata.db,创建内部表t1时没有指定location,所以t1表的存储位置为mydata数据库的存储位置下的t1目录。
这是因为创建外部表t2时指定了location为/mydata.db,所以t2表的存储位置为master:9000:/mydata.db。外部表的存储位置不受数据库的存储位置的影响,可以自由指定。
2、设表student(sid int, sname string, gender string, sdept string),其中sid, sname,gender, sdept分别表示学生的学号、姓名、性别和系别,该表对应的数据源信息目前存储在本地/data/student.txt。现在需要在sdept字段上创建一个分区表(sdept在student.txt中的取值有CS,MA,FL),请分别写出以下两个操作方案的步骤和相关指令。
(1)将student设置为静态分区表stat_buck,并将student.txt中的信息导入到stat_buck中;--7分
(2)将student设置为动态分区表dyn_buck,并将student.txt中的信息导入到dyn_buck中;
--8分
(1)
create table tmp(sid int, sname string, gender string, sdept string)
row format delimited fields terminated by '\t';
(创建一个临时表tmp,用来存储student.txt中的数据)
load data local inpath '/data/student.txt' overwrite into table tmp;
(将student.txt中的数据加载到tmp表中)
create table stat_buck(sid int, sname string, gender string)
partitioned by (sdept string)
row format delimited fields terminated by '\t';
(创建一个静态分区表stat_buck,用来存储按照sdept字段分区的数据)
insert overwrite table stat_buck partition (sdept='CS')
select sid, sname, gender from tmp where sdept='CS';
insert overwrite table stat_buck partition (sdept='MA')
select sid, sname, gender from tmp where sdept='MA';
insert overwrite table stat_buck partition (sdept='FL')
select sid, sname, gender from tmp where sdept='FL';
(将tmp表中的数据按照sdept字段的不同值(CS,MA,FL)分别插入到stat_buck表的相应分区中)
(2)
[create table tmp(sid int, sname string, gender string, sdept string)
row format delimited fields terminated by '\t';
load data local inpath '/data/student.txt' overwrite into table tmp;]可省略(未删tmp的话)
create table dyn_buck(sid int, sname string, gender string)
partitioned by (sdept string)
row format delimited fields terminated by '\t';
(创建一个动态分区表dyn_buck,用来存储按照sdept字段分区的数据)
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
(开启动态分区的功能)
insert overwrite table dyn_buck partition (sdept)
select sid, sname, gender, sdept from tmp;
(将tmp表中的数据按照sdept字段的不同值(CS,MA,FL)动态插入到dyn_buck表的相应分区)
三、综合应用题(每小8分,共40分)--位置不够可在试卷背面答题
现有图书管理数据库的三个数据模型如下:
图书(数据表名:BOOK)
序号 字段名称 字段描述 字段类型
1 BOOK_ID 总编号 文本
2 SORT 分类号 文本
3 BOOK_NAME 书名 文本
4 WRITER 作者 文本
5 OUTPUT 出版单位 文本
6 PRICE 单价 数值(保留小数点后2位)
读者(数据表名:READER)
序号 字段名称 字段描述 字段类型
1 READER_ID 借书证号 文本
2 COMPANY 单位 文本
3 NAME 姓名 文本
4 SEX 性别 文本
5 GRADE 职称 文本
6 ADDR 地址 文本
借阅记录(数据表名:BORROW LOG)
序号 字段名称 字段描述 字段类型
1 READER_ID 借书证号 文本
2 BOOK_D 总编号 文本
3 BORROW_ATE 借书日期 日期
(1)创建图书管理库的图书、读者和借阅三个基本表的表结构。请写出建表语句。
(2)找出姓李的读者姓名(NAME)和所在单位(COMPANY)。
(3)查找“清华大学出版社”的所有图书名称(BOOK_NAME)及单价(PRICE),结果按书名进行汇总分组、按照单价降序排序。
(4)查找价格介于10元和20元之间的图书种类(SORT)出版单位(OUTPUT)和单价(PRICE),结果按出版单位(OUTPUT)和单价(PRICE)升序排序。
(5)查找借书最多的读者的姓名(NAME)及所在单位(COMPANY)。
create table book (
??book_id string,
??sort string,
??book_name string,
??writer string,
??output string,
??price decimal(10,2)
)row format delimited fields terminated by ',';
创建读者表READER:
create table reader (
??reader_id string,
??company string,
??name string,
??sex string,
??grade string,
??addr string
)row format delimited fields terminated by ',';
创建借阅记录表BORROW_LOG:
create table borrow_log (
??reader_id string,
??book_id string,
??borrow_date date
)row format delimited fields terminated by ',';
(2)
Select?name,company
from reader
where name like '李%';
(3)查找“清华大学出版社”的所有图书名称(BOOK_NAME)及单价(PRICE),结果按书名进行汇总分组、按照单价降序排序。
select book_name, price?from book
where output = '清华大学出版社'
group by book_name,price
order by price desc;
(4)查找价格介于10元和20元之间的图书种类(SORT)出版单位(OUTPUT)和单价(PRICE),结果按出版单位(OUTPUT)和单价(PRICE)升序排序。
select sort, output, price
from book
where price between 10 and 20
order by output , price ;
(5)查找借书最多的读者的姓名(NAME)及所在单位(COMPANY)。
Select r.name,r.company,count(*) as sum
From reader r
Join borrow_log bl
On r.reader_id = bl.reader_id
Group by r.name,r.company
Order by sum desc
Limit 1;
With a as (
Select count(*) as s,reader_id
From borrow_log
Group by reader_id)
Select name,company,s
From a join reader
On a.reader_id=reader.reader_id
Order by s desc
Limit 1;