hive 分区表使用的一些注意事项

hive 外表数据读取:


1、hive非分区普通表:
1)建立外表:
CREATE EXTERNAL TABLE `test_liu`(
  `a` string, 
  `b` string, 
  `c` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  '/data/qytt/test/testhive'


2)上传文件到hdfs目录:
$ hadoop fs -put test1 /data/qytt/test/testhive/
3)查询:
hive> select * from test_liu;
OK
1   2   3


2、hive分区外表:
1)建立外表:
CREATE EXTERNAL TABLE `test_liu`(
  `a` string, 
  `b` string, 
  `c` string)
PARTITIONED BY ( 
  `dt` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  '/data/qytt/test/testhive'

2)上传文件到hdfs目录:
A、创建分区目录
$ hadoop fs -mkdir /data/qytt/test/testhive/dt=1
B、上传文件
$ hadoop fs -put test1 /data/qytt/test/testhive/dt=1


3)查询:
A、必须创建分区,否则查不出数据:
alter table test_liu add partition (dt="1");
hive> show  partitions test_liu;                  
OK
dt=1
B、然后查询:
hive> select * from test_liu;
OK
1   2   3
4) 此时,往/data/qytt/test/testhive/dt=1目录下再建一个空目录,
hadoop fs -mkdir /data/qytt/test/testhive/dt=1/hour=0
然后执行查询会报如下错
Failed with exception java.io.IOException:java.io.IOException: Not a file: hdfs://hadoop-jy-namenode/data/qytt/test/testhive/dt=1/hour=0


3、创建多分区目录:
1)建立外表:
CREATE EXTERNAL TABLE `test_liu`(
  `a` string, 
  `b` string, 
  `c` string)
PARTITIONED BY ( 
  `dt` string,
  `hour` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  '/data/qytt/test/testhive'

2)上传文件到hdfs目录:
A、创建分区目录
$ hadoop fs -mkdir /data/qytt/test/testhive/dt=1
B、创建分区目录
$ hadoop fs -mkdir /data/qytt/test/testhive/dt=1/hour=0
C、上传文件
$ hadoop fs -put test1 /data/qytt/test/testhive/dt=1


3)查询:
A、创建分区:
alter table test_liu add partition (dt="1");   
FAILED: SemanticException partition spec {dt=1} doesn't contain all (2) partition columns
添加多分区时,必须同时指定,否则报错
hive> alter table test_liu add partition (dt="1",hour="0");
OK
hive> show partitions test_liu;
OK
dt=1/hour=0


B、查询:
hive> select * from test_liu;
OK
发现还是没有数据,奇怪,文件已经在/dt=1目录下了,为什么还hive无法读取呢?
$ hadoop fs -put test1 /data/qytt/test/testhive/dt=1/hour=0
把test1文件放到hour=0目录下,hive就可以读取了。
hive> select * from test_liu;
OK
1   2   3
此时删除/dt=1目录下的test1文件,也不会有问题。( 由此,可以得出hive如果是分区表,那么文件只有放到最里层分区目录下才起作用,放到其他位置数据无法被读取;此外最里层分区目录里不能再有其他子目录,否则报错)
hive> select * from test_liu;
OK
1   2   3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值