需求和遇到的问题

现在手里要做一些数据统计,本来使用的是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;

结果插入成功了.

hive 窗口滚动30天数据 hive移动字段位置_数据


而且数据也没有发生移动,还是在/root/hstest/

hive 窗口滚动30天数据 hive移动字段位置_数据_02


这样也算是解决了我的问题.

但是我又想,数据一般不会再我的本地磁盘放着,最后可定是要放在hdfs上的.如果在hdfs上的数据又会如何呢?

首先将数据put到hdfs上

hadoop   fs    -put     /root/hstest/dicttest.txt     /hstest/
查看是否上传上去
hadoop fs  -ls /hstest/

结果如下,可以看到数据已经存在于HDFS上了.

hive 窗口滚动30天数据 hive移动字段位置_hive_03


下面开始操作.首先将原来创建的表给删了

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;

结果显示加载成功了

hive 窗口滚动30天数据 hive移动字段位置_hive_04


那么我的数据还在hdfs 的 /hstest 目录下么?

hadoop  fs  -ls   /hstest

hive 窗口滚动30天数据 hive移动字段位置_hive 窗口滚动30天数据_05


很显然,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 的时候数据被直接再到这里.那么怎么可以让他不移动呢?

hive 窗口滚动30天数据 hive移动字段位置_hive 窗口滚动30天数据_06


于是我又把这个表给删了,而且发现在/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 方式将数据导入进去,虽然数据移动了,但是不影响,只是换了一个存储的位置而已.