创建 Hive 分区表之前要遵循的规则
Posted
技术标签:
【中文标题】创建 Hive 分区表之前要遵循的规则【英文标题】:Rules to be followed before creating a Hive partitioned table 【发布时间】:2018-03-27 07:08:34 【问题描述】:作为我要求的一部分,我必须创建一个新的 Hive 表并以编程方式插入其中。为此,我有以下 DDL 来创建 Hive 表:
CREATE EXTERNAL TABLE IF NOT EXISTS countData (
tableName String,
ssn String,
hiveCount String,
sapCount String,
countDifference String,
percentDifference String,
sap_UpdTms String,
hive_UpdTms String)
COMMENT 'This table contains record count of corresponding tables of all the source systems present on Hive & SAP'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '';
要将数据插入 Hive 表的分区,我可以使用程序中的插入查询来处理。在创建表之前,在上面的 DDL 中,我没有添加“PARTITIONED BY”列,因为我对 Hive 表的分区规则并不完全清楚。我知道的几个规则是
-
从查询中插入数据时,分区列应该是最后一个。
PARTITIONED BY 列不应是表中的现有列。
谁能告诉我是否还有其他分区 Hive 表的规则? 同样在我的情况下,我们每天运行两次程序以将数据插入表中,每次运行时,可能会有 8k 到 10k 条记录。我正在考虑为当前日期添加一个 PARTITIONED BY 列(只是“mm/dd/yyyy”)并从代码中插入它。 如果不建议添加日期(字符串格式),是否有更好的方法来实现我的要求的分区想法?
【问题讨论】:
【参考方案1】:您提到的内容很好,但我会推荐yyyyMMdd
格式,因为它比看到03/05
并且不知道哪一天、几月是更好的排序和更标准化。
如果您想每天运行两次,并且您关心作业运行的时间,那么请PARTITIONED BY (dt STRING, hour STRING)
另外,不要使用STORED AS TEXT
。请改用 Parquet 或 ORC。
【讨论】:
明白。关于创建 Hive 表分区要遵循的规则,我提到了两点。是仅有的两个还是有其他需要注意的规则? 我不会调用这些规则。只是语法上正确,否则 Hive 会出错。我不确定您在这里寻找什么作为答案。我遵循的一个“规则”是一个表中永远不要有 10000 个总分区,并且只对实际要查询的列进行分区。例如,您可以获得日期文件夹,但如果您要扫描一年的数据,则无需关心月份和日期以上是关于创建 Hive 分区表之前要遵循的规则的主要内容,如果未能解决你的问题,请参考以下文章