在HIVE中,分区列不是基础保存数据的一部分?

时间:2013-10-02 16:08:03

标签: sql hadoop hive bigdata

我有一些日志数据,包含字段

  1. id,tdate,info
  2. 我创建了一个动态分区表

    CREATE TABLE log_partitioned(id STRING,  info STRING)
    PARTITIONED BY ( tdate STRING) 
    

    然后我正在加载数据

    FROM logs lg
    INSERT OVERWRITE TABLE log_partitioned PARTITION(tdate)
    SELECT lg.id, lg.info, lg.tdate
    DISTRIBUTE BY tdate;
    

    通过动态分区成功加载数据。但是当我试图查看

    的数据时
    hdfs dfs -cat /user/hive/warehouse/log_partitioned/tdate=2000-11-05/part-r-00000
    

    只有两列值。

    • id1,info1

    • id2,info2 ....

    如果我们运行配置单元查询

    select * from log_partitioned limit 10
    

    显示所有三列。我应该怎么做,hive还将分区列存储在基础数据中?

1 个答案:

答案 0 :(得分:2)

我相当确定hive默认情况下根本不会这样做。您可以使用自定义SerDe和/或Input / OutputFormat来完成它,但它可能很棘手。问题是任何人都可以将数据放在这些分区文件夹中,如果他们为该列放置包含错误值的数据,Hive将如何协调它?

你的用例是什么?如果您正在执行您所说的dfs -cat命令,那么从您传入的路径中显而易见的是不是显而易见的?如果你真的想在shell命令的输出中使用它,那么就像:

dfs -cat /foo/bar/tdate=2000-11-05/part-r-00000 | sed -e 's/$/  2000-11-05/'

另一种可能的解决方法是将相同的数据存储在表中的两列中。像这样:

CREATE TABLE log_partitioned(id STRING, info STRING, tdate_1 STRING)
PARTITIONED BY (tdate_2 STRING);

FROM logs lg
INSERT OVERWRITE TABLE log_partitioned PARTITION(tdate)
SELECT lg.id, lg.info, lg.tdate as tdate_1, lg.tdate as tdate_2
DISTRIBUTE BY tdate_2;