hive插入命令示例

时间:2020-02-23 14:33:30  来源:igfitidea点击:

一个hive dml命令探索是插入命令。
我们基本上有三个插入变体;其中两个如下列表所示。
要演示此新DML命令,我们将创建一个新表,该表将在FlightInfo2008表中保存数据的子集。

(A) CREATE TABLE IF NOT EXISTS myFlightInfo (
  Year SMALLINT, DontQueryMonth TINYINT, DayofMonth TINYINT, DayOfWeek TINYINT,
  DepTime SMALLINT, ArrTime SMALLINT,
  UniqueCarrier STRING, FlightNum STRING,
  AirTime SMALLINT, ArrDelay SMALLINT, DepDelay SMALLINT,
  Origin STRING, Dest STRING, Cancelled SMALLINT,
  CancellationCode STRING)
COMMENT 'Flight InfoTable'
PARTITIONED BY(Month TINYINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
(B) STORED AS RCFILE
TBLPROPERTIES ('creator'='Bruce Brown', 'created_at'='Mon Sep  2 14:24:19 EDT 2013');
(C) INSERT OVERWRITE TABLE myflightinfo
  PARTITION (Month=1)
  SELECT Year, Month, DayofMonth, DayOfWeek, DepTime, ArrTime, UniqueCarrier,
         FlightNum, AirTime, ArrDelay, DepDelay, Origin, Dest, Cancelled,
         CancellationCode
  FROM FlightInfo2008 WHERE Month=1;
(D) FROM FlightInfo2008
INSERT INTO TABLE myflightinfo
  PARTITION (Month=2)
  SELECT Year, Month, DayofMonth, DayOfWeek, DepTime, ArrTime, UniqueCarrier, FlightNum,
  AirTime, ArrDelay, DepDelay, Origin, Dest, Cancelled, CancellationCode WHERE Month=2
... (Months 3 through 11 skipped for brevity)
INSERT INTO TABLE myflightinfo
  PARTITION (Month=12)
  SELECT Year, Month, DayofMonth, DayOfWeek, DepTime, ArrTime, UniqueCarrier, FlightNum,
  AirTime, ArrDelay, DepDelay, Origin, Dest, Cancelled, CancellationCode WHERE Month=12;
(E) hive (flightdata)> SHOW PARTITIONS myflightinfo;
OK
month=1
month=10
month=11
month=12
...
month=9
(F) $ls /home/biadmin/Hive/warehouse/flightdata.db/myflightinfo
month=1   month=11  month=2  month=4  month=6  month=8
month=10  month=12  month=3  month=5  month=7  month=9
(G) $HIVE_HOME/bin/hive --service rcfilecat
  /home/biadmin/Hive/warehouse/flightdata.db/myflightinfo/month=12/000000_0
...
2008    12      13      6       655     856     DL      1638    85      0       -5      PBI     ATL     0
2008    12      13      6       1251    1446    DL      1639    89      9       11      IAD     ATL     0
2008    12      13      6       1110    1413    DL      1641    104     -5      7       SAT     ATL     0

在步骤(a)中,我们创建此新表并指定文件格式将是行柱状(步骤(b))而不是文本。
此格式比文本更紧凑,并且通常更好地执行,具体取决于访问模式。
(如果我们正在访问一个小列的子集而不是整行,请尝试rcfile格式。
)

RCFile格式的默认Serde是ColumnArserde。
我们可以通过从命令行界面运行devile扩展的myflightinfo hiveql命令来验证此事实。

创建表后,使用INSERT overwrite命令[请参阅步骤(c)]以通过FlightInfo2008表中的SELECT语句插入数据。
请注意,我们正在使用基于月的字段使用分区关键字进行分区。

完成后,我们将在虚拟机上的文件系统的仓库目录下有12个表分区或者实际目录,对应于一年中的12个月。
如果要仅在某个月内查询MyFlightInfo表中的数据,则分区可以大大提高查询性能。

我们可以使用步骤(e)和(f)中的show partitions命令查看分区方法的结果。
步骤(d)中的通知,我们正在使用INSERT命令的变体,一次将数据插入多个分区。
仅显示第2和12个为简洁而显示,但月3到11将具有相同的语法。

分区对Hive程序员非常有用。
但是,遇到分区可能变得笨重的数据集并不罕见,尤其是如果指定了多个分区[by(country字符串,personname字符串)分区]。
十二个分区是一件事 - 70亿个分区将是另一件事!

分区蔓延的解决方案是铲斗。
通过允许我们指定一些合理数量的桶,然后系统试图将数据均匀分配到我们指定的存储桶数量的桶中。
[这可能看起来像(...)群集的(铲斗column)群集成x存储桶。
]

此外,此函数使表采样 - 一种技术,允许蜂巢用户在数据的示例上写查询而不是整个表。
Hiveql表采样对于大数据分析非常有用。

我们还可以从Table1插入到Table2中选择...格式以一次插入多个表。
我们使用INSERT而不是覆盖覆盖以显示插入而不是覆盖的选项。
Hive允许仅添加,而不是插入到表中,因此INSERT关键字只是指示Hive将数据添加到表中。

最后,在步骤(g)中,我们必须使用特殊的Hive命令服务(rcfilecat)来查看仓库中的此表,因为rcfile格式是一种二进制格式,与前一个TextFile格式示例不同。

插入dml命令有三个变体。
第三种变体是动态分区插入变体。
在列表中,我们将MyFlightInfo表分区为12个段,每月1个段。
如果我们有数百个分区,则此任务将变得非常困难,并且需要脚本来完成作业。

相反,Hive支持使用INSERT覆盖语句动态创建分区的技术。
因此,如果我们发现自己需要用大而可能的变量杠杆分区,请在Hive DML语言手册中查看动态分区插入函数。