我有一些日志数据,包含字段
我创建了一个动态分区表
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还将分区列存储在基础数据中?
答案 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;