建表
hive中建表一般分为两种情况
1、普通内部表
建表语句:create table tablename(name string,num int);
创建内部表的时候,内部表直接存储在默认的hdfs路径,不带有数据;删除内部表的时候,内部表会将数据和元数据全部删除。
2、外部表
建表语句:create external table tablename(name string,num int)
row format delimited
fields terminated by ','
location '/test';
比在创建内部表的时候增加一个关键字:external
同时还有有数据分割语句row format delimited fileds terminated by ','
最后再写上外部表的建表路径 location ‘xxxx’
创建外部表的时候,需要自己指定路径,同时在删除表时,只删除元数据,数据并不删除
导入数据
可以通过2种方式将数据导入到hive中
1、从本地文件系统中导入数据到hive表
基本语句:
load data local inpath '/usr/local/data/demo1.txt'
overwrite into table tablename;
从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下,然后再将数据从那个临时目录下移动(注意是移动!!不是复制)到对应的Hive表的数据目录里面。既然如此,那么Hive肯定支持将数据直接从HDFS上的一个目录移动到相应Hive表的数据目录下,
2、从HDFS上导入数据到Hive表
基本语法:
load data inpath '/user/root/data/demo2.txt'
overwrite into table tablename;
使用OpenCSVSerde
相信大家在使用hive进行数据存储分析过程中,会经常碰到需要上传CSV文件格式的数据。由于CSV文件在hive中是自动按 " , " 进行分割的,而我们经常会发现数据中就已经带有 " , " 这就会导致我们将数据导入到hive中已经创建好的表时,出现一个数据占据好几个字段,出现数据混乱的问题。
为了解决这个问题,hive为我们提供了用于专门处理CSV的OpenCSVSerde
OpenCSVSerde具有一下字符串数据特性:
- 使用双引号 (
"
) 作为默认引号字符,还允许您指定分隔符、引号和转义符 \t
或\n
无法直接转义。要对它们进行转义,请使用"escapeChar" = "\\"
- 不支持 CSV 文件中的嵌入换行符
以下是具体使用示例:
hive> create external table ods_job_message(
> crawl_datetime timestamp,
> url string,
> company_name string,
> company_size string,
> company_type string,
> job_type string,
> job_name string,
> edu string,
> )
> row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
> with serdeproperties
> (
> 'separatorChar' = ',',
> 'quoteChar' = '\"',
> 'escapeChar' = '\\'
> )
> location '/data';
OpenCSVSerde中默认的分隔符separatorChar、quote、escape分别为, " 和 ‘
这就可以完美解决在读写CSV文件中遇到数据中带有 ","的问题。
这些数据虽然都带有, 但全都在同一个字段下。
tips:导入CSV文件时跳过第一行
在创建表的语句后加上:
tblproperties("skip.header.line.count"="1") --就可以完美跳过文件行首行
版权归原作者 大大大大可爱松鼠 所有, 如有侵权,请联系我们删除。