Hive(6)--Hive操作语句(2)

·  阅读 55

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

内部表和外部表的区别及其应用场景

加载数据的区别

内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除。

外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。外部表数据相对来说更加安全些,因为各种前端不会直接提供hdfs的删除接口。同时外部表数据组织也更加灵活,方便共享源数据。

删除时候的区别

内部表:内部表删除后会将元数据和路径下的文件都删除

外部表:外部表只删除元数据,不删除路径下的文件

load加载数据的区别

内部表:会把数据移动到自己指定的路径下。也就是HDFS的路径

外部表:不会把数据移动到自己的数据仓库目录下,也因此证明外部表的数据不是由自己管理的。

应用场景:

内外部表的使用没有一个固定的规范,facebook之所以会提供这2种接口,应该是因为如下:

  1. 做etl处理时,通常会选择内部表做中间表,因为清理时,会将HDFS上的文件同时删除

  2. 如果怕误删数据,可以选择外部表,因为不会删除文件,方便恢复数据

  3. 如果对数据的处理都是通过hql语句完成,选择内部表,如果有其他工具一同处理,选择外部表

  4. 每天采集的ng日志和埋点日志,在存储的时候建议使用外部表,因为日志数据是采集程序实时采集进来的,一旦被误删,恢复起来非常麻烦。而且外部表方便数据的共享。

  5. 抽取过来的业务数据,其实用外部表或者内部表问题都不大,就算被误删,恢复起来也是很快的,如果需要对数据内容和元数据进行紧凑的管理, 建议使用内部表。

  6. 在做统计分析时候用到的中间表,结果表可以使用内部表,因为这些数据不需要共享,使用内部表更为合适。并且很多时候结果分区表我们只需要保留最近3天的数据,用外部表的时候删除分区时无法删除数据。

  7. 在没有其他限制的情况下,优先使用外部表,因为:

    1. 不会加载数据到hive,减少数据传输,还能共享
    2. 不会对HDFS中的数据修改,不用担心数据损坏,删除表时只删除表结构,不删除数据后续有其他的总结,会再补上。
  8. 全量内部,增量外部→因为增量需要频繁变动

表创建过程中的分隔符设置

在hive中除了字段的分割关系外,存在着一些特殊的数据类型需要相应的分割符号进行区分,例如Array和Map。Hive中有默认配置,但是我们也可以自定义设置(大多数情况下都是依据需要进行设置)

案例:

#数据集     **下方为导入的案例数据集**

202111131111|华为Mate10|id:1,token:token1,usename:逆风飞翔|1235-345
202111131112|华为Mate30|id:2,token:toke2,username:没关系,没关系|89-635
202111131113|小米5|id:3,token:token3,username:嘿嘿嘿|452-63
202111131114|小米6|id:4,token:token4,username:就这!|785-36
202111131115|OPPO Findx|id:5,token:token5,username:态度。|7875-3563

#语句 案例
CREATE EXTERNAL TABLE jacquesh_databases.orders
(
 order_id STRING,
 goods_name STRING,
 info map<string,string>,
 associate array<int>
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY "|"                **此处设置字段的分割符号为“|**
collection items terminated by '-'      **此处设置数组的分割符号为“-**
map keys terminated by ':';             **此处设置Map的分割符号为“:”**

#导入数据(在hive-cli中)
load data **local** inpath **'/home/bigdata/data/hive_data'** into table jacquesh_databases.orders;
**-> local 关键字代表从系统路径下导入数据
->绿色部分代表了数据存在那个路径下**

#成功导入数据后
使用
select *  from jacquesh_databases.orders
**可以看到显示的数据**
order_id    |goods_name|info                                   |associate  |
------------+----------+---------------------------------------+-----------+
202111131111|华为Mate10  |{"id":"1,token:token1,usename:逆风飞翔"}   |[1235,345] |
202111131112|华为Mate30  |{"id":"2,token:toke2,username:没关系,没关系"}|[89,635]   |
202111131113|小米5       |{"id":"3,token:token3,username:嘿嘿嘿"}   |[452,63]   |
202111131114|小米6       |{"id":"4,token:token4,username:就这!"}   |[785,36]   |
202111131115|OPPO Findx|{"id":"5,token:token5,username:态度。"}   |[7875,3563]|
复制代码
分类:
后端
标签:
分类:
后端
标签: