Hive基础编程入门(一)
设置查询时显示字段名称 hive> set hive.cli.print.header=true; 设置cli模式下显示当前所在的数据库名称 hive> set hive.cli.print.current.db=true; 设置hive的安全措施为"strict(严格)"模式(如果对分区表查询的WHERE子句中没有加分区过滤的话,将禁止提交这个任务) hive> set hive.mapred.mode=strict; 默认的数据库文件目录是/user/hive/warehouse/hivedb.db,如修改默认存放路径,可通过如下命令: hive> create database hivedb > location '/data1/metadatadb 为创建的数据库增加描述信息 hive> create database hivedb > comment 'this is a test database'; 从文件导入数据到hive表 ECHO "one row" > /tmp/tmpfile hive -e "LOAD DATA LOCAL INPATH '/tmp/myfile'" INTO TABLE src; 拷贝一张已经存在的表的结构(不拷贝数据) hive> create table if not exists hivedb.copiedtable like hivedb.templatetable; 查看某张表的详细表结构信息(包括tableName:copiedtable, dbName:hivedb, owner:binguo, createTime:1488883326等信息) hive> describe extended copiedtable; 格式化查看某张表的详细表结构信息(提供更高可读性的详细输出信息,实际使用情况也是FORMATTED更多些) hive> describe formatted copiedtable; hive中创建外部表(读取所有位于/data1/extdirectory目录下以逗号分隔的数据) create external table if not exists requiretable_ext( id INT, name STRING, info STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/data1/extdirectory'; hive中查看某张表是否是外部表(通过末尾的详细表信息输出可以看到 ...TableType:MANAGED_TABLE视为管理表 ...TableType:EXTERNAL_TABLE视为外部表) hive> describe formatted target_user_table; hive中创建分区表(对数据进行分区,最重要的原因就是为了更快的查询) create table bigtable( province STRING, city STRING, info STRING ) PARTITIONED BY(province STRING,city STRING); 查看hive表中所有存在的分区 hive> show partitions target_user_table; 查看hive表中指定了一个或多个分区字段值的PARTITION子句,进行过滤查询 hive> show partitions target_user_table PATITION(province='anhui',city='bozhou') 在管理表中可以通过载入数据的方式创建分区(Ps.HiveSQL中通过${env:HOME}方式引用HOME环境变量),eg: hive> load data local inpath '${env:HOME}/loadfiles-dirctory' > into table target_user_table > partition(province='anhui',city='bozhou') 其实就是hive创建了分区对应的目录 .../loadfiles-dirctory/province=anhui/city=bozhou hive创建外部分区表(alter table 语句可以单独对这个外部分区表增加分区) create external table if not exists target_user_table_ext ( provice string, recordid int, city string, info string ) partitioned by(year int,month int,day int) row format delimited fields terminated by '\t'; 对hive外部分区表增加分区 alter table target_user_table_ext add partition(year=2017,month=7,day=31) location 'hdfs://.../2017/07/31'; 使用hadoop fs -rmr命令删除HDFS下的某个分区 hadoop fs -rmr /.../2017/07/31'; 文献语录: Hive不关心一个分区对应的分区目录是否存在或分区目录下是否有文件。如果分区目录不存在或分区目录下没有文件,则对于这个 过滤分区的查询将没有返回结果。当用户想在另外一个进程开始往分区中写数据之前创建好分区时,这样做是很方便的。 数据一旦存在,对于这份数据的查询就会有结果返回。 和非分区外部表一样,Hive并不控制这些数据。即使表被删除,数据也不会被删除。 查看分区数据实际存在的路径 describe formatted target_user_table_ext partition(year=2017,month=7,day=31); hive删除表(对于管理表,表的元数据信息和表内的数据都会被删除) drop table if exists target_user_table; 文献语录: 事实上,如果用户开始了Hadoop的回收站功能(这个功能默认是关闭的),那么数据将会被转移到用户在分布式文件系统中的 用户根目录下的.Trash目录下,也就是HDFS中的/user/@USER/.Trash目录。如果想开启这个功能,只需要将配置属性fs.trash.interval 的值设置为一个合理的正整数即可。这个值是“回收站检查点”间的时间间隔,单位是分钟。因此如果设置值为1440,那么就 表示是24小时。不过并不能保证所有的分布式系统以及所有的版本都支持这个功能。如果用户不小心删除了一张存储这很重要的 管理表的话,那么可以先重建表,然后重新所需要的分区,再从.Trash目录中将误删的文件移动到正确的文件目录下 (使用文件系统命令)来重新存储数据。 对于外部表,表的元数据信息会被删除,但是表中的数据不会被删除。 大多数的表属性可以通过alter table语句来进行修改。这种操作会修改元数据,但不会修改数据本身。 表的重命名 hive> alter table copiedtable rename to product_fact_table; 分区表的增加、修改、删除表分区(alter table tablename add partition ...语句为表(通常为外部表)添加新分区) hive> alter table target_user_table add if not exits > partition (year=2017,month=8,day=1) location '.../2017/08/01' > partition (year=2017,month=8,day=2) location '.../2017/08/02'; 修改分区表对应的文件目录路径 hive> alter table target_user_table partition(year=2017,month=7,day=31) > set location '...other_directory/2017/07/31'; 删除表中的某个分区 hive> alter table target_user_table drop if exists partition(year=2017,month=7,day=31); 修改列信息(可以对某个字段重命名,并修改其位置、类型或注释) hive> alter table target_user_table change column recordid SMALLINT > comment 'change recordid type int to smallint' > after info; 参考文献《Hive编程指南》 未完待续...
posted on 2017-07-31 21:11 BingCorePower 阅读(262) 评论(0) 编辑 收藏 举报