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

18

静态分区和动态分区在Hive中的主要区别是什么?使用单独插入表示静态分区,而对分区表进行单个插入则表示动态分区。是否还有其他优点?

4个回答

32

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

例如,如果我们在表t1(userid,name,occupation,country)的列country上进行了分区,那么每次都需要提供country值。

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;
  • 确保分区列始终是非分区表中的最后一列(因为我们在t2中有country列)


  • 2
    为什么分区列必须在非分区表的最后一列? - Khatri
    1
    @Khatri 如果不这样做,它会“搞乱”数据分区。我尝试了一个示例员工,如name, salary(分区),designation。当从非分区表加载到分区表时,尽管将列指定为Salary,但并未得到遵守。数据被按职称拆分,最糟糕的是HDFS中的分区文件结构为/user/hive/warehouse/test.db/employee/salary=Technical/000000_0 - Kishore Bandi

    26

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

    当插入数据到表中时,就会创建分区。根据数据的加载方式,您需要使用不同类型的分区。通常,在将文件(大文件)加载到Hive表中时,建议使用静态分区。这样可以节省加载数据的时间,与动态分区相比。您可以"静态地"添加表中的分区,然后将文件移动到表的分区中。由于文件通常很大,它们通常在HDFS中生成。您可以从文件名、日期等获取分区列值,而无需读取整个大文件。

    当使用动态分区时,整个大文件即每一行数据都会被读取,并通过MR任务将数据分区到目标表中,具体取决于文件中的某些字段。因此,通常在数据管道中进行ETL流程时,动态分区非常有用。例如,您可以通过移动命令将一个巨大的文件加载到Table X中,然后运行一个插入查询到Table Y,并基于Table X中的字段(例如日期、国家)对数据进行分区。您可能还想进一步运行ETL步骤,将Table Y中的国家分区的数据分区到Table Z中,其中数据仅基于特定国家的城市进行了分区等。

    因此,根据您的最终表或数据要求以及源数据的形式,您可能会选择使用静态或动态分区。


    @Urvisinh,你有静态和动态分区的具体示例吗? - user2102237

    2

    Hive中的静态分区

    将输入数据文件逐个插入到分区表中称为静态分区。 通常在将文件(大文件)加载到Hive表中时,首选静态分区。

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

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

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

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

    Hive中的动态分区

    向分区表中单独插入数据称为动态分区。

    通常情况下,动态分区从未分区的表中加载数据。

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

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

    如果要对列数进行分区,但不知道有多少列,则动态分区也是合适的。

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

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

    SET hive.exec.dynamic.partition = true;

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


    -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;
    

    第二个答案中第四栏需要澄清。 - Vamshavardhan Reddy

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接