(1)查指标字典(指标算法是否一样)
(2)验证是否是正常波动范围(环比,同比):是正常问题就不用理会,不是正常问题就查找问题下降原因
数据分析最基础:对比分析——>与自己,与他人
(3)以上没问题之后再找数据下降原因
问题拆解(逻辑树+假设)——>按公式拆解
毛利润=销量*(价格-成本)
销量下降——>用户下降是否正常
价格下降——>价格
成本上升——>增加渠道
自习时间 | 就业率 |
---|---|
6h | 99% |
4h | 96% |
2h | 94% |
可以预估增加自习时间,可以提高就业率大概2%,不能盲目拍脑袋决定
产品不同时期的追求不同
以平均值分隔,平均数不容易受极值点的影响
中位数也可以,不过中位数容易受极值点的影响
注意:要把指标带入指标字典才有对比性
离线数据库(Hive) | 普通数据库(Mysql ) |
---|---|
入仓不变(历史数据和日志数据) | 业务数据,经常变 |
添加和提取 | 增、删、改、查 |
只有元数据,表映射的是HDFS里的文件数据 | 存数据,锁和事物 |
数据格式由用户定义 | 数据格式由系统决定 |
不支持数据更新 | 支持数据更新 |
无索引 | 有索引 |
执行的是MapRedcue | 执行的是Executor |
执行延时高 | 执行延时低 |
可扩展性高 | 可扩展性低 |
数据规模大 | 数据规模小 |
(1)存储——>映射
(2)复杂类型
(3)分隔符
(4)分区
(5)排序:四种
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)] ----指定表的名称和表的具体列信息。
[COMMENT table_comment] ---表的描述信息。
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] ---表的分区信息。
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] ---表的桶信息。
[ROW FORMAT row_format] ---表的数据分割信息,格式化信息。
[STORED AS file_format] ---表数据的存储序列化信息。
[LOCATION hdfs_path] ---数据存储的文件夹地址信息。
-(1)查看表的转态(个数,有哪些表?)
show
show tables;
-(2)本地写入txt文档,建立一个描述学生的文件student.txt
新建 student.txt;
echo student.txt;
编辑student.txt的内容(两种方式)
vim student.txt
vim
是编辑
一般不用,因为你在本地文件追加了也传不到表里面
echo 1232 >> student.txt
>>
是追加;>
是覆盖;
查看 student.txt的内容
cat student.txt
查看 student.txt的内容
cat student.txt
(3)建表
CREATE TABLE students(name STRING,age INT,stature INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
- 第一行声明一个students表,包含三列name,age,stature。还必须指明每一列的数据类型,这里我们指定了姓名为字符串类型,年龄和身高都是整型。
- 第二行的ROW FORMAT DELIMITED是HiveQL所特有的,声明的是数据文件的每一行是由制表符分隔的文本。Hive按照这一格式读取数据:每行3个字段,分别对应表中的3列,以换行符分隔。
- 第三行FIELDS TERMINATED BY '\t’表示字段间以制表符分隔。
(4)导入本地数据(student.txt)——>在hive里面导入
LOAD DATA LOCAL INPATH '/student.txt'
INTO TABLE students;
LOAD DATA LOCAL INPATH '/student.txt'
OVERWRITE INTO TABLE students;
(5)查询表中内容
select * from students;
加载数据到托管表时,Hive把数据移到仓库目录。
LOAD DATA LOCAL INPATH '/student.txt' INTO TABLE students;
要丢弃一个表,可以使用一下语句:
DROP TABLE students;
这个表,包括它的元数据和数据,都会被一起删除。在这里要重复强调,因为最初的LOAD是一个移动操作,而DROP是一个删除操作,所以数据会彻底消失。这就是Hive所谓的“托管数据”的含义。
对于外部表而言,这两个操作的结果就不一样了:由你自己来控制数据的创建和删除。外部数据的位置需要在创建表的时候指明:
CREATE EXTERNAL TABLE external_table(dummy STRING)
LOCATION '/user/tom/external_table';
LOAD DATA INPATH '/data.txt' INTO TABLE external_table;
使用EXTERNAL关键字后,Hive知道数据并不由自己管理,因此不会把数据移到自己的仓库目录。事实上,在定义时,它甚至不会检查这一外部位置是否存在。这是一个非常有用的特性,因为这意味着你可以把创建数据推迟到创建表之后才进行。
丢弃外部表时,Hive不会碰数据,而是只会删除元数据。
ALTER TABLE source RENAME TO target;
Hive允许修改列的定义,添加新的列,甚至用一组新的列替换表内已有的列。
ALTER TABLE target ADD COLUMNS (col3 STRING)
新的col3被添加在已有列的后面。数据文件并没有更新,因此原来的查询会为col3的所有值返回空值null(当然,除非文件中原来就已经有额外的字段)。
更常用的做法是创建一个定义了新列的新表,然后使用SELECT语句把数据填充进去。
DROP TABLE语句用于删除表的数据和元数据。如果是外部表,就只删除元数据——数据不会受到影响。
如果要删除表内的所有数据,但要保留表的定义,删除数据文件即可,例如:
dfs -rmr /user/hive/warehouse/my_table;
Hive把缺少文件(或根本没有表对应的目录)的表认为是空表。
另外一种达到类似目的的方法是使用LIKE关键字创建一个与第一个表模式相同的新表。如:
CREATE TABLE new_table LIKE existing_table;
# comment是注释
create table info(
id int comment 'id',
name string comment '名称',
id_array array comment '相关id列表',
map_info map comment '状态信息',
more_info struct )
row format delimited fields terminated by '|'
collection items terminated by ','
map keys terminated by ':';
也可以丢弃coment
# 创建表
create table info(
id int,
name string,
id_array array,
map_info map,
more_info struct )
row format delimited fields terminated by '|'
collection items terminated by ','
map keys terminated by ':';
echo info.txt;
vim info.txt;
123|华为|1235,345|id:1111,token:1122,user_name:zhangsan1|a,10
456|华为|89,635|id:1111,token:1122,user_name:zhangsan3|b,20
789|小米5|452,63|id:2211,token:1122,user_name:zhangsan2|c,30
1235|小米5|785,36|id:1115,token:2222,user_name:zhangsan5|d,50
4562|OPPO Findx|7875,3563|id:1111,token:2222,user_name:zhangsan6|d,50
cat info.txt
LOAD DATA LOCAL INPATH '/info.txt' INTO TABLE info;
select * from info;
select id_array[0] from info;
select map_info['user_name'] from info;
select more_info.p_type from info;
vim info.txt;
数据:
123|华为|1235,345|id:1111,token:1122|z,10
(1)新建一个txt文件:
echo info1.txt;
(2)编辑txt文件;
vim info1.txt;
txt文件 只有这一条数据:
123|华为|1235,345|id:1111,token:1122|z,10
LOAD DATA LOCAL INPATH '/info1.txt' INTO TABLE info;
select * from info
where not array_contains(map_keys(map_info),'user_name');
# concat_ws相当于mysql里的group_concat
select *,
concat_ws('',id_array) from info;
select *,
concat_ws('',map_values(map_info)) from info;
(1)%1%:放%%的
(2)rlike:放正则表达式的
# 第一种方法:
select *,
concat_ws('',map_values(map_info)) from info
where concat_ws('',map_values(map_info)) like '%5%';
# 第二种方法:
# 跟上面的效果一样
select *,
concat_ws('',map_values(map_info)) from info
where concat_ws('',map_values(map_info)) rlike '1';
select *,map_key,map_value from info
lateral view explode(map_info) xuni as map_key,map_value;
select *,map_key,map_value,size(map_info) as b from info
lateral view explode(map_info) xuni as map_key,map_value;
select * from
(select *,map_key,map_value,size(map_info) as b from info
lateral view explode(map_info) xuni as map_key,map_value) a;
select *,map_key,map_value,size(map_info) as b from test
lateral view explode(map_info) xuni as map_key,map_value
where concat_ws('',map_values(map_info)) like '%5%';
select * from
(select *,map_key,map_value,size(map_info) as b from info
lateral view explode(map_info) xuni as map_key,map_value) a
where map_value like '%5%';
# 没出结果是正常的,因为没报错
select id,max(b),count(*) from
(select *,size(map_info) as b from info
lateral view explode(map_info) xuni as map_key,map_value)as a
where map_value like '%1%'
group by id
having max(b)=count(*);
select id,max(b),count(*) from
(select *,size(id_array) b from info
lateral view explode(id_array) info1 as ids)as a
where ids like '%3%'
group by id
having max(b)=count(*);
collect_set:去重
collect_lis:不去重
select id,collect_set(name),collect_list(name) from
(select *,size(id_array) b from info
lateral view explode(map_info) info1 as map_key,map_value)as a
group by id;
insert overwrite local directory '/home/hadoop/test_output'
row format delimited fields terminated by '\t'
select * from info;
show create table info;
CREATE TABLE `info2`(
`id` int COMMENT 'id',
`id_array` array COMMENT '??id??',
`map_info` map COMMENT '????',
`more_info` struct)
partitioned by (name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';
set hive.exec.dynamic.partition.mode=nonstrict
insert into table `info2` partition(name)
select id,id_array,map_info,more_info,name from info;