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

Main difference between dynamic and static partitioning in Hive

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

Hive 中的分区对于在查询期间 p运行e 数据以减少查询时间非常有用。

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

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

因此,根据您的目的 table 或对数据的要求以及在源头以何种形式生成数据,您可以选择静态或动态分区。

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

假设我们在 table 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. 创建一个 non-partitioned table t2 并向其中插入数据。
  2. 现在创建一个 table t1 在预期的列(比如国家)上分区。
  3. 从 t2 加载 t1 中的数据,如下所示:

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

Hive 中的静态分区

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

与动态分区相比,静态分区可以节省您加载数据的时间 您“静态”在 table 中添加一个分区并将文件移动到 table.

的分区中

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

您可以从文件名、日期等中获取分区列值,而无需读取整个大文件。 如果你想在配置单元中使用静态分区,你应该设置 属性

set hive.mapred.mode = strict
这个属性默认设置在hive-site.xml 静态分区处于严格模式 您应该使用 where 子句在静态分区中使用限制 您可以在 Hive Manage table 或外部 table.

上执行静态分区

Hive 中的动态分区

单次插入分区table称为动态分区

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

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

当您在 table 中存储大量数据时,动态分区是 suitable。

如果你想分区列数但不知道有多少列那么动态分区也是suitable

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

您可以对外部 table 和托管 table 配置单元执行动态分区 如果要在 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;

将“本地日期”列移至 SELECT 中的最后一列。对于在 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;