需求和遇到的问题
现在手里要做一些数据统计,本来使用的是Ignite,但是发现挺慢的,可能是我的本本配置太低了,执行一条语句得很久.所以还是使用hive来进行统计.但是在加载数据的时候总是会出现上传的数数据被移动.看了很多博客,也算知道了原因,记录一下采坑的过程
解决方式:两种情况
数据如果在本地,直接load的时候加上local关键字
数据如果在hdfs 上在创建表的时候指定location " 文件路径目录"
解决过程;
创建测试表
drop table if exists yaocao.dicttest;
create table yaocao.dicttest (
bccdoe String,
customercode String ,
bcountrycode String
)row format delimited fields terminated by '\t';
测试一:将一份数据放在服务器的/root/hstest 目录下 没有上传到hdfs上
load data inpath "/root/hstest/dicttest.txt" into table yaocao.dicttest;
结果
出现No files matching path hdfs://10.0.1.145:9000/root/hstest/dicttest.txt的错误
意思是在hdfs的这个路径下没有匹配到文件 说明如果load文件不加local 参数的时候,inpath默认使用的是hdfs的路径.
我们先不把数据上传到hdfs 加上local关键字看可不可以加载进去.
load data local inpath "/root/hstest/dicttest.txt" into table yaocao.dicttest;
结果插入成功了.
而且数据也没有发生移动,还是在/root/hstest/
这样也算是解决了我的问题.
但是我又想,数据一般不会再我的本地磁盘放着,最后可定是要放在hdfs上的.如果在hdfs上的数据又会如何呢?
首先将数据put到hdfs上
hadoop fs -put /root/hstest/dicttest.txt /hstest/
查看是否上传上去
hadoop fs -ls /hstest/
结果如下,可以看到数据已经存在于HDFS上了.
下面开始操作.首先将原来创建的表给删了
drop table dicttest;
再重新创建表(是不是脑子有问题,刚删了,又创建,这不是为了验证么,要有耐心)
创建语句还是上面的没有变.
drop table if exists yaocao.dicttest;
create table yaocao.dicttest (
bccdoe String,
customercode String ,
bcountrycode String
)row format delimited fields terminated by '\t';
然后是加载数据.这里我们首先还是不加任何,直接load
load data inpath "/hstest/dicttest.txt" into table yaocao.dicttest;
结果显示加载成功了
那么我的数据还在hdfs 的 /hstest 目录下么?
hadoop fs -ls /hstest
很显然,dicttest.txt那个文件不见了.我很伤心.他去哪里了呢?
当然是跑到hive配置的目录下了,我没记错应该是在hive-site.xml
这个文件中指定的.我去瞅瞅配置在哪里了.
cd /Application/Aleiye/distributed/hive/hive-1.1.0-cdh5.15.1/conf/
vim hive-site.xml
不过可惜,我在里面没发现有这个设置的.好像是默认的(默认的位置是在/user/hive/warehouse
下 ),不过可以配置,你可以加这个属性,然后配置目录
hive.metastore.warehouse.dir
这是我后来查找到的;
3)修改default数据仓库原始位置(将hive-default.xml.template如下配置信息拷贝到hive-site.xml文件中)。
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
配置同组用户有执行权限
bin/hdfs dfs -chmod g+w /user/hive/warehouse
姑且就这么着吧.我去hdfs的这个目录下看看有没有就可以了
hadoop fs -ls /user/hive/warehouse/yaocao.db
果然让我找到了,说明我在load 的时候数据被直接再到这里.那么怎么可以让他不移动呢?
于是我又把这个表给删了,而且发现在/user/hive/warehouse/yaocao.db 这个目录下的dicttest.txt也没了.(这里又好像是一个知识点.内部表和外部表的区别,这个可以后面有时间再说)
那么怎么才能让在hdfs上的数据让我将数据加载进去又不会移动数据呢?
经过一顿百度查找,终于好像找到了一种方式.
就是在创建表的时候将数据的位置指定.
所以我的建表语句这次终于有变化了.
drop table if exists yaocao.dicttest;
create table yaocao.dicttest (
bccdoe String,
customercode String ,
bcountrycode String)
row format delimited fields terminated by "\t"
location "/hstest" ;
通过上面的建表语句是可以实现建表并将数据导入,而且数据的位置没有移动.
但是有一个很难受的问题就是我的文件是在/hstest/下的dicttest.txt , 如果我在这个文件下面还有其他文件,那他不是都给我加载进去了. 这个问题暂时没有结果.
其实,在我查阅资料的过程中发现,通过第二种这种方式直接加载数据很少,大多数都是建好表,然后通过load 方式将数据导入进去,虽然数据移动了,但是不影响,只是换了一个存储的位置而已.