hive导入数据到表

叁歲伎倆 2021-09-27 10:50 584阅读 0赞

转自:hive数据操作(翻译自Hive wiki+实例讲解)

hive有两种数据修改方式

从文件加载到hive表

加载数据到表时,hive不会做任何转换。加载操作是纯粹的复制/移动操作,移动数据文件到相应的hive表。

语法

  1. LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
  2. 实例

假设hive的warehouse目录是/user/hadoop/warehouse,这里有一个login表

  1. CREATE TABLE login (
  2. uid BIGINT,
  3. ip STRING
  4. )
  5. PARTITIONED BY (dt STRING)
  6. ROW FORMAT DELIMITED
  7. FIELDS TERMINATED BY ','
  8. STORED AS TEXTFILE;

对应有一个用户登录日志文件,文件内容如下:

  1. 888,8.8.8.8
  2. 999,9.9.9.9

注意,列与列之间是用’,’号隔开,第一列是uid,第二列是用户ip。

接着加载数据

  1. LOAD DATA LOCAL INPATH '/data/login/20130101.csv' OVERWRITE INTO TABLE login PARTITION (dt='20130101');
  2. 这表示从本地磁盘,把文件 '/data/login/20130101.csv' 拷贝到表login,分区dt'20130101'的目录(在HDFS)下.加载成功后,20130101.csv会放置在 hdfs://namenode:9000/user/hadoop/warehouse/login/dt=20130101/20130101.csv。

OVERWRITE表示目标表(或分区)在数据加载前会删除,然后替换为新的数据。如果不指定OVERWRITE,则会追加数据到目标表(或分区)下,如果文件名和目标目录的文件冲突,会自动改名。

LOCAL如果不指定,就是从HDFS的’/data/login/20130101.csv’移动数据到表login,分区分区dt为’20130101’的目录下。即是,原来的HDFS文件’/data/login/20130101.csv’是被移动到hdfs://namenode:9000/user/hadoop/warehouse/login/dt=20130101/20130101.csv。

注意:加载的文件名不能是一个子目录,hive做一些最简单的检查,以确保正在加载的文件和目标表匹配。目前,它会检查,如果该表存储为sequencefile格式 - 正在加载的文件是反序列化。

从查询插入数据到hive表

标准语法

  1. INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
  2. INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

示例:

  1. INSERT OVERWRITE TABLE login_user select distinct uid FROM login_log; --从登录日志表查询登录用户,插入到表login_user中,如果login_user已有数据,则覆盖,否则创建
  2. INSERT OVERWRITE TABLE login_user PARTITION (dt='20130101') select distinct uid FROM login_log where dt='20130101'; --从20130101的登录日志表查询当天的登录用户,插入到表login_user中,如果login_user已有分区dt='20130101',则覆盖,否则创建
  3. INSERT INTO TABLE login_user select distinct uid FROM login_log; --从登录日志表查询登录用户,插入到表login_user中,如果login_user已有数据,则追加,否则创建
  4. INSERT INTO TABLE login_user PARTITION (dt='20130101') select distinct uid FROM login_log where dt='20130101'; --从20130101的登录日志表查询当天的登录用户,插入到表login_user中,如果login_user已有分区dt='20130101',则追加,否则创建

扩展语法

多个插入

  1. FROM from_statement
  2. INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
  3. [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2]
  4. [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;
  5. FROM from_statement
  6. INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
  7. [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2]
  8. [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] ...;

一次查询,把结果集插入到多个表或分区。实际中,感觉用的比较少,这里不做示例。

动态分区插入

  1. INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
  2. INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;

标准语法已经包含了动态分区插入了,这里不另外介绍。

参考 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

发表评论

表情:
评论列表 (有 0 条评论,584人围观)

还没有评论,来说两句吧...

相关阅读