Hive 中动态分区和静态分区的主要区别



Hive中静态分区和动态分区的主要区别是什么?使用单个插入意味着静态,对分区表的单个插入意味着动态。还有其他优势吗?

在静态分区中,我们需要在每个 LOAD 语句中指定分区列值。

假设我们在表 T1(用户 ID、名称、职业、国家/地区)的列国家/地区上进行了分区,因此每次我们需要提供国家/地区值

hive>LOAD DATA INPATH '/hdfs path of the file' INTO TABLE t1 PARTITION(country="US")
hive>LOAD DATA INPATH '/hdfs path of the file' INTO TABLE t1 PARTITION(country="UK")

动态分区允许我们不必每次都指定分区列值。我们遵循的方法如下:

  1. 创建一个非分区表 T2 并向其中插入数据。
  2. 现在创建一个在预期列(例如国家/地区)上分区的表 T1。
  3. 从 T2 加载 T1 中的数据,如下所示:

    hive> INSERT INTO TABLE t2 PARTITION(country) SELECT * from T1;
    
  4. 确保分区列始终是非分区表中的最后一个(因为我们在 T2 中有国家/地区列)

Hive 中的分区对于在查询期间修剪数据以减少查询时间非常有用。

将数据插入表时创建分区。根据加载数据的方式,您将需要分区。通常,将文件(大文件)加载到 Hive 表中时,首选静态分区。与动态分区相比,这可以节省加载数据的时间。您"静态"在表中添加一个分区,并将文件移动到表的分区中。由于文件很大,它们通常在HDFS中生成。您可以从文件名,日期等中获取分区列值,而无需读取整个大文件。

在动态分区的情况下,整个大文件,即读取数据的每一行,并根据文件中的某些字段通过MR作业将数据分区到目标表中。因此,当您在数据管道中执行某种 ETL 流时,通常动态分区很有用。例如,您通过移动命令将一个巨大的文件加载到表 X 中,然后对表 Y 运行惰性查询,并根据表 X 中的字段(例如日期、国家/地区)对数据进行分区。您可能希望进一步运行 ETL 步骤,将表 Y 中国家/地区分区中的数据分区到表 Z 中,其中数据仅根据特定国家/地区的城市进行分区。等。

因此,根据您的结束表或对数据的要求以及在源中生成数据的形式,您可以选择静态或动态分区。

Hive 中的静态分区

将输入数据文件单独插入分区表是静态分区通常,将文件(大文件)加载到 Hive 表中时,首选静态分区

与动态分区相比,静态分区可节省加载数据的时间您"静态"在表中添加一个分区,并将文件移动到表的分区中。

我们可以更改静态分区中的分区

您可以从文件名,日期等中获取分区列值,而无需读取整个大文件。如果要在 hive 中使用静态分区,则应设置属性


set hive.mapred.mode = strict此属性在配置单元站点中默认设置.xml静态分区处于严格模式您应该使用 where 子句在静态分区中使用限制可以在 Hive 管理表或外部表上执行静态分区。

配置单元中的动态分区

单次插入到分区表称为动态分区

通常动态分区从非分区表中加载数据

与静态分区相比,动态分区在加载数据时花费更多时间

当您在表中存储大量数据时,动态分区是合适的。

如果您想对列数进行分区,但不知道有多少列,那么动态分区也是合适的

动态分区不需要 where 子句来使用限制。我们无法对动态分区执行更改

可以对 Hive 外部表和托管表执行动态分区如果要在 Hive 中使用动态分区,则模式处于非严格模式下面是应允许的 hive 动态分区属性

SET hive.exec.dynamic.partition = true;

SET hive.exec.dynamic.partition.mode = nonstrict;

HIVE 中的动态分区:

CREATE TABLE temps_orc_partition_date
(statecode STRING, countrycode STRING, sitenum STRING, paramcode STRING, poc STRING, latitude STRING, longitude STRING, datum STRING, param STRING, timelocal STRING, dategmt STRING, timegmt STRING, degrees double, uom STRING, mdl STRING, uncert STRING, qual STRING, method STRING, methodname STRING, state STRING, county STRING, dateoflastchange STRING)
PARTITIONED BY (datelocal STRING)
STORED AS ORC;

将"日期本地"列移至"选择"中的最后一个。 要使动态分区在 Hive 中正常工作,这是一项要求。

INSERT INTO TABLE temps_orc_partition_date
PARTITION (datelocal)
SELECT statecode, countrycode, sitenum, paramcode, poc, latitude, longitude, datum, param, timelocal, dategmt, timegmt, degrees, uom, mdl, uncert, qual, method, methodname, state, county, dateoflastchange, datelocal
FROM temps_txt;

最新更新