sql—在配置单元中,分区列不是基础保存数据的一部分?

iszxjhcz  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(245)

我有一些日志数据,有字段
id、日期、信息
我创建了一个动态分区表

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。。。。
如果我们运行配置单元查询

select * from log_partitioned limit 10

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

hgb9j2n6

hgb9j2n61#

我相当肯定Hive在默认情况下根本不会这样做。您可以使用自定义serde和/或输入/输出格式来完成它,但这可能很棘手。问题是,任何人都可以将数据放在这些分区文件夹中,如果他们将包含该列错误值的数据放在这些分区文件夹中,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;

相关问题