1 某文件的权限为:d-rw-r–r-,用数值形式表示该权限,则该八进制数为:(),该文件属性是:()。0644 目录
2 结束后台进程的命令是:()。kill -9 进程号
3 为脚本程序指定执行权限的命令及参数是:()。chmod +x 脚本
4 Linux文件权限一共10位长度,分成四段,第三段表示的内容是()。C
A 文件类型 B 文件所有者的权限
C 文件所有者所在组的权限 D其他用户的权限
5 Linux有三个查看文件的命令,若希望在查看文件内容过程中可以用光标上下移动来查看文件内容,应使用()命令。C
A cat B more C less D menu
6 删除文件命令为()。D
A mkdir B rmdir C mv D rm
7 建立一个新文件可以使用的命令为()。D
A chmod B more C cp D touch
8 ()命令是在vi编辑器中执行存盘退出。B
A :q B ZZ C :q! D :WQ
1 Hive内部表和外部表的区别
创建表使用location指定数据所在的位置时,hive所在的database目录下不会创建相应的目录。当删除内部表时,会同时删除对应的目录及目录中的数据。删除外部表时,不会删除对应的目录及目录中的数据。
使用场景:当处理中间数据时,可以使用内部表,把表删除的同时也把中间的数据删除掉。当处理原始数据时,应该使用外部表,把表删除的时候,不会删除对应的目录及数据。
2 请说明hive中Sort By, Order By, Cluster By, Distribute by 各代表什么意思
Sort By:局部排序,在会reduce之前为每个reducer生成一个排序文件。
Order By:会对全部数据进行全局排序。
Distribute By:控制map结果的分发,将具有相同字段的map分发到一个reduce节点上做处理。
Cluster By:通常Distribute by和Sort By一起使用。Cluster By是Distribute by和Sort By的结合体。
3 需求分析题目
数据文件(字段分隔符是’|’):data_20180507.txt、data_20180508.txt、data_20180509.txt、data_201805010.txt、data_20180511.txt、data_20180512.txt、data_20180513.txt
App访问信息表(app_visit_info)表结构:
字段名 | 字段类型 | 中文名称 | 备注 |
---|---|---|---|
UID | string | 用户id | |
appname | string | App名称 | |
visit_cnt | bigint | 使用次数 | |
visit_day | string | 访问天 | 分区字段 |
数据HDFS存放路径:/data/test.db/
数据准备要求:
1 创建分区表(按天分区)
CREATE EXTERNAL TABLE app_visit_info (UID STRING, appname STRING, visit_cnt BIGINT)
PARTITIONED BY (visit_day STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
2 一周的数据加载到表中
LOAD DATA INPATH '/data/test.db/data_20180507.txt' INTO TABLE app_visit_info PARTITION (visit_day='20180507');
LOAD DATA INPATH '/data/test.db/data_20180508.txt' INTO TABLE app_visit_info PARTITION (visit_day='20180508');
LOAD DATA INPATH '/data/test.db/data_20180509.txt' INTO TABLE app_visit_info PARTITION (visit_day='20180509');
LOAD DATA INPATH '/data/test.db/data_20180510.txt' INTO TABLE app_visit_info PARTITION (visit_day='20180510');
LOAD DATA INPATH '/data/test.db/data_20180511.txt' INTO TABLE app_visit_info PARTITION (visit_day='20180511');
LOAD DATA INPATH '/data/test.db/data_20180512.txt' INTO TABLE app_visit_info PARTITION (visit_day='20180512');
LOAD DATA INPATH '/data/test.db/data_20180513.txt' INTO TABLE app_visit_info PARTITION (visit_day='20180513');
需求描述(按天出如下需求的统计数据):
1 统计用户数;
select count(DISTINCT UID) from app_visit_info;
2 统计每个app的用户数;
select appname,count(UID) from app_visit_info group by appname;
3 统计用户使用app个数的分布(即,使用1个app的人数,使用2个app的人数,使用3个app的人数…使用n个app的人数);
select app_cnt,count(uid) as uid_count from (select UID,count(appname) as app_cnt from app_visit_info group by UID)t group by app_cnt;
4 统计用户数top 100的APP(如果用户数相等使用访问次数进行排名),以及对应的用户数和总的访问次数。
select appname,count(UID),sum(visit_cnt) as visit_cnt_sum as uid_cnt from app_visit_info group by appname order by uid_cnt desc,visit_cnt_sum desc limit 100;
5 将需求1-4封装成脚本,日期当做参数,并在服务器上设置成定时任务(0点执行)。(只要写出核心代码即可)
myshell.sh
#!/bin/bash
hive的绝对路径 -e " \
insert overwrite local directory '本地目录1' \
row format delimited fields terminated by '#' \
select count(DISTINCT UID) from app_visit_info where visit_day = '$1';"
hive的绝对路径 -e " \
insert overwrite local directory '本地目录2' \
row format delimited fields terminated by '#' \
select appname,count(UID) from app_visit_info where visit_day = '$1' group by appname;"
hive的绝对路径 -e " \
insert overwrite local directory '本地目录3' \
row format delimited fields terminated by '#' \
select app_cnt,count(uid) as uid_count from (select UID,count(appname) \
as app_cnt from app_visit_info where visit_day = '$1' group by UID)t group by app_cnt;"
hive的绝对路径 -e " \
insert overwrite local directory '本地目录4' \
row format delimited fields terminated by '#' \
select appname,count(UID),sum(visit_cnt) as visit_cnt_sum as uid_cnt \
from app_visit_info where visit_day = '$1' group by appname order by uid_cnt desc, \
visit_cnt_sum desc limit 100;"
使用crontab执行定时任务
使用crontab -e进入任务的编辑
0 0 * * * shell脚本目录 20180507(日期参数)
ps:这里涉及到几个知识点
linux的基础知识要熟练掌握;
hive的外部表、内部表、临时表等的区别;
hive创建表格及导入、导出数据;
hql各种查询语句的使用;
shell脚本的编写;
crontab定时任务的使用;
如果有任何问题,或者有什么想法,随时联系我,大家一起交流,共同进步。
我的邮箱 [email protected]