hive、hadoop使用
hive常用命令
进入hive、执行hive命令
- hive
- hive -e “select …”
查看表结构
- show create table_name
创建表
建表语句
CREATE EXTERNAL TABLE IF NOT EXISTS xxx_drainage_mark(
time string,
st string,
id string,
extend string,
drainageType string,
source string)
PARTITIONED BY (
dt string,
hour string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 'viewfs://c9/user_ext/xxx_bigdata_xxx/warehouse/xxx_drainage_mark'
内表、外表(EXTERNAL):
-
在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的
-
在建表时,应根据使用场景选择内、外表。如果存储场景的表,应使用外表,以防误删表时能够恢复数据;如自己临时使用的表和给产品创建的表,使用内表即可。
-
为了方便管理,及时清理hdfs数据内存,我们在创建内部表时应规范统一命名。目前格式暂定为tmp _日期 _邮箱前缀 _用途,例如 tmp _20210903 _xxx _midxx。
-
后续定时清理临时内部表,暂定每月10号清理前一个月内部表。
-
附清理脚本
#!bin/bash export HADOOP_HOME=/usr/local/hadoop-2.7.3 export JAVA_HOME=/usr/local/jdk1.8.0_131 hive="/usr/local/hive-0.13.0/bin/hive" hive -e "show tables " > tables array=($(cat tables)) month=$(date -d "1 month ago" +"%Y%m") str=tmp_${month} for(( i=0;i<${#array[@]};i++)) do table_name=${array[i]}; if [[ "$table_name" =~ ^"${str}".* ]]; then hive -e "drop table ${table_name}" ${table_name} >> dropTableName_${month} fi done
分区(PARTITIONED):
- 在查询中一般会扫描整个表内容,会消耗很多时间查之外的数据,为了减少查询耗时和查询时使用资源数,可增加分区,查询时只查询某些分区。
行分割符(ROW FORMAT DELIMITED FIELDS TERMINATED BY)
- 指定数据分割字段
数据格式
-
STORED AS INPUTFORMAT … OUTPUTFORMAT …
-
默认是textfile类型,该类型文件存储就是正常的文本格式,将表中的数据在hdfs上以文本的格式存储,下载后可以直接查看,也可以使用cat命令查看。显示指定为
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
-
另外格式为sequencefile和rcfile(平常使用不到),以二进制格式存储,不支持可视化查看,显示指定为
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.SequenceFileInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
存储位置(LOCATION)
- LOCATION一般与外部表(EXTERNAL)一起使用,存储位置看配置文件
建临时表
CREATE TABLE table_name (
uid STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
注:
- 临时表使用内部表,通常情况下无需分区,采用默认数据格式即可。
删除表
仅删除表中数据,保留表结构(truncate)
- truncate table table_name;
- truncate 不能删除外部表!
删除表结构(drop)
- drop table table_name;
删除某个分区的数据
- alter table table_name drop partition (partition_name=‘分区名’)
分区
添加分区
- ALTEL TABLE table_name add PARTITION(分区名称,字段类型)
删除分区
- ALTER TABLE table_name drop PARTITION(dt=202108903)
修改表名
- ALTER TABLE table_name1 rename to table_name2;
修改表字段名
- ALTER TABLE table_name CHANGE name1 name2 String;
内、外表转化
内部表转外部表
- alter table table_name set TBLPROPROTIES (‘EXTERNAL’=‘TRUE’);
外部表转内部表
- alter table table_name set TBLPROPROTIES (‘EXTERNAL’=‘FALSE’);
加载数据
落入文件数据(给产品传表常用)
将文件传至服务器上,使用命令落入表中即可。
- load data local inpath ‘file_name’ overwrite into table table_name
加载其他表中数据
-
INSERT INTO TABLE table_name PARTITION (dt=xxx) SELECT …
插入字段和查询字段对齐即可
hadoop常用命令
调用文件系统(FS)Shell命令
shell命令 | 区别 |
---|---|
hadoop fs | fs是文件系统,该命令可以用于其他文件系统,不止是hdfs文件系统内,该命令的使用范围更广 |
hadoop dfs | 专门针对hdfs分布式文件系统 |
hdfs dfs | 相比于上面的命令更为推荐,并且当使用hadoop dfs时内部会被转为hdfs dfs命令 |
注:
官方文档用的hadoop fs 下述用hadoop fs
常用命令(和linux命令基本一致)
操作 | 命令 |
---|---|
查看文件内容 | hadoop fs -cat |
查看文件、目录信息 | hadoop fs -ls |
查看文件尾部1k内容 | hadoop fs -tail |
文件大小 | hadoop fs -du |
复制文件到本地文件系统 | hadoop fs -get |
本地文件系统复制到hdfs | hadoop fs -put |
文件移动 | hadoop fs -mv |
创建目录 | hadoop fs -mkdir |
创建文件 | hadoop fs -touchz |
删除文件、目录 | hadoop fs -rm |
递归删除 | hadoop fs -rmr |
扩展
误删恢复
hadoop删除文件时,不会立即删除文件夹,而是将其移动到回收站目录下,延迟删除,所以误删后第一时间可以回复。
删除后会有移到的回收站位置,使用hadoop fs -mv 命令将回收站的邮箱移动回原目录下即可
hadoop fs -mv hdfs://ns3-backup/user/xxx_bigdata_xxx/.Trash/Current/user/xxx_bigdata_xxx/warehouse/xxx_feature_judge_log/2021/08/31 hdfs://ns3-backup/user/xxx_bigdata_xxx/warehouse/xxx_feature_judge_log/2021/08
kafka落hive表脚本
#!/bin/bash
export HADOOP_HOME=/usr/local/hadoop-2.7.3
export JAVA_HOME=/usr/local/jdk1.8.0_131
HIVE=/usr/local/hive-0.13.0/bin/hive
HADOOP=/usr/local/hadoop-2.7.3/bin/hadoop
date=$(date -d"1 hour ago" +"%Y%m%d")
hour=$(date -d"1 hour ago" +"%H")
partition=$(date -d"1 hour ago" +"%Y/%m/%d/%H")
$HADOOP distcp -m 100 -bandwidth 20 hdfs://ns1-backup/file/kafka2hdfs/xxx_rid_mid_map/$partition viewfs://c9/user_ext/xxx_bigdata_xxx/warehouse/xxx_rid_mid_map/$partition
sql="CREATE EXTERNAL TABLE IF NOT EXISTS xxx_rid_mid_map(
rid string,
mid string)
PARTITIONED BY (
dt string,
hour string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'viewfs://c9/user_ext/xxx_bigdata_xxx/warehouse/xxx_rid_mid_map'"
$HIVE -e "$sql"
$HIVE -e "ALTER TABLE xxx_rid_mid_map ADD PARTITION (dt=$date, hour=$hour) LOCATION '$partition'"