我遇到了在Hive中创建分区表的问题,其中包含":"和" /"特殊字符作为分区列名称中的值。我发现这个JIRA分区本身已经创建了,但是我无法从Hue访问HDFS上的数据文件,也无法在Hue的分区查看器中看到它们的结果。我发现了一个相关的JIRA,但问题已修复并在版本0.6.0中提交(我在0.13上)
以下是我的原始数据:
1241241; Joe Schmo; TAXI DRIVER; 08/06/2015; 01/04/2014; 13:20
我的临时登台表是这样创建的:
CREATE EXTERNAL TABLE IF NOT EXISTS nyc_cab_drivers
(
License_Number bigint,
Name string,
Type string,
Expiration_Date string,
Last_Updated_Date string,
Last_Updated_Time string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '...'
TBLPROPERTIES (
'skip.header.line.count'='1'
);
我的分区表定义是:
CREATE TABLE IF NOT EXISTS part2_nyc_cab_drivers
(
License_Number bigint,
Name string,
Type string,
Expiration_Date string,
Last_Updated_Date string
)
PARTITIONED BY (Last_Updated_Time string)
CLUSTERED BY (Name) INTO 128 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n';
然后我将数据加载到分区表中,如下所示:
FROM nyc_cab_drivers ncd
INSERT OVERWRITE TABLE part2_nyc_cab_drivers
PARTITION (Last_Updated_Time)
SELECT ncd.License_Number, ncd.Name, ncd.Type, ncd.Expiration_Date, ncd.Last_Updated_Date, ncd.Last_Updated_Time;
对于这个例子,我使用了动态分区,但是当我使用静态分区时也会出现同样的问题(即Last_UpdatedTime =" 12:41")。运行负载后,分区将显示在HUE中。我可以看到分区列,特殊字符由十六进制转义,如下所示:" 12%3A41"。当我点击分区值时,它会打开分区但是说“#34;操作没有结果。”#34;根据结果。当我点击路径时,Hue告诉我:
Cannot access: /user/hive/warehouse/default.db/part2_nyc_cab_drivers/last_updated_time=12:41.
IllegalArgumentException: Pathname /user/hive/warehouse/default.db/part2_nyc_cab_drivers/last_updated_time=12:41 from /user/hive/warehouse/default.db/part2_nyc_cab_drivers/last_updated_time=12:41 is not a valid DFS filename. (error 400)
我在HDFS中看到为每个分区创建的目录,我只是无法打开它来查看数据文件。当我进行show partitions查询时,我看到列出的分区意味着它们已经创建,只是与HDFS名称有关。当我将分区列更改为具有" /"的日期值时,会发生同样的问题。字符 - 唯一的区别是我可以打开分区目录并查看其数据文件,但它仍然没有显示分区的结果。
非常感谢任何帮助!