创建 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 分区表之前要遵循的规则的主要内容,如果未能解决你的问题,请参考以下文章

源码级解读如何解决Spark-sql读取hive分区表执行效率低问题

sparksql怎么批量删除分区

Hive的静态分区和动态分区

Hive - 仅获取一个或多个 hive 表的最新分区

Hive分区表简介

Hive 基本语法操练:分区操作和桶操作