1

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

  1. id、tdate、信息

我创建了一个动态分区表

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,信息1

  • id2,信息2 ....

如果我们运行 hive 查询

select * from log_partitioned limit 10

它显示了所有三列。我应该怎么做那个配置单元还将分区列存储在基础数据中?

4

1 回答 1

2

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

你的用例是什么?如果您正在执行dfs -cat您正在谈论的命令,那么 tdate 从您传入的路径中不是很明显吗?如果您真的希望它出现在 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;
于 2013-10-02T17:55:17.793 回答