
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
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'
CREATE TABLE table_name (
uid STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
注:
将文件传至服务器上,使用命令落入表中即可。
INSERT INTO TABLE table_name PARTITION (dt=xxx) SELECT …
插入字段和查询字段对齐即可
| 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/08kafka落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'"