Hive SQL | 结构化文件映射为二维表
- 【数据库之建表】
- 数据库在hdfs中默认存储位置是,/user/hive/warehouse/dbname.db。可以通过hdfs的file system直接找到
- 【使用hive将结构化文件映射为数据库表】
- 首先使用sql语句建表,对照结构化文件的字段内容和格式,以及顺序。注意建表完成后,会在hdfs数据库的指定路径下生成该表名对应的文件夹,用于存放需要被映射的结构化文件
- 区别于普通sql,需要在字段指定完成后加上分隔符的指定。语法如下:
row format delimited
fields terminated by "\t"; -- 字段之间的分隔符是 制表符 tab
- 然后需要将结构化文件上传到hdfs该表对应的文件夹下,接下来就可以通过sql语句select看到被映射完成的表。
- 【上传结构化文件到hdfs中】
上面第4步是从web页面手动上传的流程,但这不够简洁,从终端上传可以这样来完成:
- hadoop -put 命令。其中1.txt是结构化文件的路径,后面的路径就是表所在的目录路径.
hadoop fs -put 1.txt /user/hive/warehouse/itheima.db/t_1
官方推荐的方式是使用load而不是上面手动完成。
- 从本地加载local。本地指的是hive所在的本地,即node1。从beeline客户端看日志可以看到 file😕/xxx表明是从本地加载。是纯复制操作
load data local inpath '/root/hivedata/students.txt' into table itheima.student_local;
- 从hdfs加载。把结构化文件上传到hdfs的某个路径,从beeline客户端看日志可以看到 hdfs😕/xxx表明是从hdfs加载。是移动操作,把结构化文件移动到了warehouse表目录下面
load data inpath '/students.txt' into table itheima.student_hdfs;
- 【常用show语句】
-- 显示数据库
show databases;
show schemas;
-- 切换到某个数据库
use dbname;
-- 显示当前数据库下所有表
show tables;
show tables in dbname; -- 显示某个数据库下所有表
-- 显示表的元数据,记录了表的字段、位置、创建时间等
desc formatted tbname;
- 【comment注释乱码解决】
乱码原因:元数据保存在mysql中,而mysql不支持中文。
解决:在安装了mysql的节点(我的是node1)上,连接mysql服务:
mysql -u root -p
然后切换到数据库hive3,执行下面的语句:
alter table hive3.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table hive3.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8 ;
alter table hive3.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table hive3.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
需要注意的是,这样操作之后,原本已经写死的表注释仍然是乱码,需要drop掉之前的表重新创建才能解决乱码。并且hdfs也需要重新上传结构化文件,否则是空表。