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

青旅半醒 2021-06-24 15:57 691阅读 0赞

hive 外表数据读取:

1、hive非分区普通表:
1)建立外表:

  1. CREATE EXTERNAL TABLE `test_liu`(
  2. `a` string,
  3. `b` string,
  4. `c` string)
  5. ROW FORMAT DELIMITED
  6. FIELDS TERMINATED BY '\t'
  7. STORED AS INPUTFORMAT
  8. 'org.apache.hadoop.mapred.TextInputFormat'
  9. OUTPUTFORMAT
  10. 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  11. LOCATION
  12. '/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)建立外表:

  1. CREATE EXTERNAL TABLE `test_liu`(
  2. `a` string,
  3. `b` string,
  4. `c` string)
  5. PARTITIONED BY (
  6. `dt` string)
  7. ROW FORMAT DELIMITED
  8. FIELDS TERMINATED BY '\t'
  9. STORED AS INPUTFORMAT
  10. 'org.apache.hadoop.mapred.TextInputFormat'
  11. OUTPUTFORMAT
  12. 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  13. LOCATION
  14. '/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)建立外表:

  1. CREATE EXTERNAL TABLE `test_liu`(
  2. `a` string,
  3. `b` string,
  4. `c` string)
  5. PARTITIONED BY (
  6. `dt` string,
  7. `hour` string)
  8. ROW FORMAT DELIMITED
  9. FIELDS TERMINATED BY '\t'
  10. STORED AS INPUTFORMAT
  11. 'org.apache.hadoop.mapred.TextInputFormat'
  12. OUTPUTFORMAT
  13. 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  14. LOCATION
  15. '/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 条评论,691人围观)

还没有评论,来说两句吧...

相关阅读

    相关 hive注意事项

    (1)hive中创建的表存储在mysql中和hdfs的/user/hive/warehouse路径下 表中的元数据存储在mysql中 (2)hive中创建的外部表在工作中最

    相关 Hive动态分区使用

    1.有时候为了更方便地根据某个时间字段来进行增量更新数据,我们可以使用分区。而相对来说,这种时候用动态分区会多一些。 2.首先,先进入Hive命令行,输入一下的设置,打开动态

    相关 hive 分区

    hive中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash分区、混合分区等)。分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说在表的数据文件中实际