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