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

时间:2015-06-18 17:03:41

标签: hive

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

4 个答案:

答案 0 :(得分:21)

在静态分区中,我们需要在每个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. 现在创建一个在预期列(例如country)上分区的表t1。
  3. 从t2加载t1中的数据如下:

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

答案 1 :(得分:17)

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

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

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

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

答案 2 :(得分:-1)

Hive中的静态分区

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

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

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

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

set hive.mapred.mode = strict
默认情况下,此属性在hive-site.xml中设置 静态分区处于严格模式 您应该使用where子句在静态分区中使用limit 您可以在Hive Manage表或外部表上执行静态分区。

Hive中的动态分区

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

通常动态分区从非分区表

加载数据

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

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

如果要分区列数,但不知道有多少列,那么动态分区也是合适的

动态分区没有必要的where子句使用limit。 我们无法在动态分区上执行alter

您可以在配置单元外部表和托管表上执行动态分区 如果要在配置单元中使用动态分区,则模式处于非严格模式 以下是您应该允许的hive动态分区属性

SET hive.exec.dynamic.partition = true;

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

答案 3 :(得分:-2)

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;

将“datelocal”列移动到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;