下面是在尝试找出现空分区文件的原因,大概
hdfs dfs -put /opt/module/hive/datas/student.txt /user/hive/warehouse/stu_buck
stu_buck是表名,文件导入
load data inpath '/student.txt' into table stu_buck; 不管用,分区文件有,但是大小为0
查询也能查到,其实查到的是刚才导入的student.txt文件里的,在导入文件到stu_buck目录下以后,表就能查到信息了,然后运行load data那个,只是建立了分区文件,但文件里是空的,原因我还没有搞明白
load data inpath '/user/hive/warehouse/stu/student.txt' into table stu_buck;
运行这个的话,会出现
[08S01][1] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask
这个报错,我怀疑是权限问题,因为
load data inpath '/user/hive/student.txt' into table stu;
运行这一句时报错信息一样,这个是我搞错了表
忘了说了,虽然会报错,但会出现
000000_0_copy_1 |
这个文件,这个里面有东西,不是空的,这是在我没有删表,重新load的情况下出现的,
我去,我换了load data inpath '/user/hive/student.txt' into table stu;也报错了上述信息,我看看是不是因为原本的分区文件没删的缘故
不行,还是失败,原因一样,我再尝试一下把这个表目录下的student.txt删了再试试
还是不行,可能是我没删stu_buck表的原因,我发现表里还有数据,我这次把表删了试试。
好了,运行成功,分区文件在hdfs里也有,我再导入一次,看看报错信息一不一样。
果然,报错信息一样,还在hdfs里生成了原本分区文件名字后面带copy_1的一样的文件。
我又删了分区文件,然后重新导入,这次或许能成功,还是失败,但在我删除了分区文件以后,表里数据本来消失了,这次虽然失败,但表里数据又有了。我接着删除了报错之后有的分区文件,表里数据没了
我又一次删了表,导入student.txt到表的目录下,我要删了这个txt文件,然后看看表里数据还在不在。数据不在了,我接着导入,报错,(我分区文件忘删了,我删了分区文件再试一次),好,报错,也是出来了分区文件,但是空的。这次应该是因为文件不存在,我换另一个不再表的目录里的student.txt文件试试,估计还要报错,因为我一开始忘了生成了空的分区文件,果然,报错了,但是数据插进去了,虽然名字比正常的多了copy_1。
接下来我要尝试删完表目录下的所有文件,然后导入别的目录下的txt文件。失败了,一样的报错信息。我准备删表再次尝试,成功导入,有分区文件,且不为空
我准备再尝试一下第一次就这样load data inpath '/user/hive/warehouse/stu/student.txt' into table stu_buck;导入
换了文件导入的dfs目录,
hdfs dfs -put /opt/module/hive/datas/student.txt /user/hive
没导入到到表里,就可以了
报错信息可能是
oad data inpath '/user/hive/student.txt' into table stu_buck; 我运行的是这一句,然后报错[08S01][1] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask,但是数据有了
统计信息收集任务失败了,应该是这个原因
禁用自动统计信息收集并重新加载数据
禁用自动统计信息收集,然后重新加载数据:
SET hive.stats.autogather=false;
LOAD DATA INPATH '/user/hive/student.txt' INTO TABLE stu_buck;
不弹报错了,表里多了copy_1副本
删了原本分区文件,只留副本,也有数据,又导入一次,出现了和原本一样的分区文件
删完以后正常能导入,这时我开了自动统计信息收集,然后我又导入一次,这次也没报错,奇怪,我确认我开了自动统计信息收集,又导入一次,也没报错。
我到另一个表就报错,估计是缓存,我尝试了关闭以后弄报错那个表,再开,就也不会报错了
我把hive关了重开也不报错,我重开datagrip试试,也不报错
我新开一个表试试,新表第二次导入就会报错了
删表重新导就可以了,报错就会出来了
我在最早的第一个表试了,删掉所有分区文件,然后导入,第二遍还是不报错,只有删表了
我再试试先弄出来有内容的分区文件,然后往里导入txt那个完整的文件
我再删了分区文件,看看还有没有数据,
我还没删分区文件,发现多了一份数据,txt的,删了txt,表里对应的就会少。
删了分区文件,只剩txt的数据
我再导入试试,表里的txt文件,我看看能不能有带数据的分区文件
报错,然后是空的分区文件
导入别的目录下的试试,删了分区文件,导入后依旧会报错,但有分区文件,数据也有,成了数据加起来的量
我删完所有文件再导,报错,有分区文件和数据
删表,重建,重新从别的目录下的txt文件导入,删分区文件,重新导入,报错。我怀疑有个什么task文件统计信息,那个可能有缓存,没有删掉,只删了分区文件,可能会报错关于统计信息的
又一次尝试
这是忘了一种情况,我把txt文件传到了st表目录下,我去一个新的表里尝试导入这个txt
ok,成功导入,没有报错,也生成了有内容的分区文件。
总结
[08S01][1] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask
报错信息一直都是上面这个
hdfs dfs -put /opt/module/hive/datas/student.txt /user/hive/warehouse/stu_buck
这一句能成功导入到创建的stu_buck目录里,这个目录其实是创建的分桶表,然后
load data inpath '/student.txt' into table stu_buck;
会出现分区文件,但是是空的,表里也有数据,但这个数据其实是dfs导入的student.txt文件里的删了空的分区文件倒无所谓,删了txt文件,表里就不显示了
可以关掉自动统计信息那个,代码在前面有
这样不会报错,第二次导入会报错可能是跟这个什么统计信息有关,第二次导入可能是会有两份这个,冲突,导致报错,但是不影响分区文件的生成,如果是从别的目录下导入的txt,就是有数据的分区文件。还有就是关了以后再打开,不管你导入几次都不会再报错,除非你删表重建重新导,你重开hive都不管。
你第二次导入会生成和原本的分区文件名字基本一样,只是多了copy_1而已的新的分区文件,这个数据也是一样的,而且不会重复,和下面这种情况一样(这里最后一句有问题)
先弄出来有数据的分区文件,然后再用dfs -put导入txt文件,会出现两份数据在表里,就累计加起来了,你在hdfs目录里删哪一个,表里就会少哪一个。与copy_1的文件情况不同,这个数据会重复,copy_1的不会重复出现在表中,
!!!改正,copy_1的数据也会出现,上面那句是错误的,copy_1的数据也是会重复出现的。之前测试的时候是有空的分区文件,是我的疏忽。