Loading files into tables

语法

1 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
2
3 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)

概要

在Hive 3.0版本之前的load操作都是纯粹的copy/move操作:move datafiles into locations corresponding to Hive tables

  • filepath:

    • 相对路径: project/data1
    • 绝对路径:/user/hive/project/data1
    • URI: hdfs://namenode:9000/user/hive/project/data1
  • 被加载的目标位置可以是表或分区,如果是分区必须指定所有分区的具体值(有多少分区就要写多少个分区)
  • filepath可以是具体的文件,也可以是文件夹,如果是文件夹,hive将会移动该文件夹下的所有文件到hive表中
  • 如果指定了关键字LOCAL
    • 将会在本地系统寻找filepath,如果是相对路径,将会被认为是相对于用户工作目录相当于:file:///user/hive/project/data1
    • 注意:如果是在HiveServer2上操作改指令,filepath将引用HiveServer2上的路径,HiveServer2必须有改文件的访问权限
  • 没有指定关键字LOCAL
    • filepath没有指定schema(如HDFS://),将会读取HADOOP中配置的fs.default.name来指定 Namenode URI
    • filepath不是绝对路径,Hive认为是相对于/user/<username>
  • 如果使用了OVERWRITE关键字,目标表或表分区的内容将会被删除,并被替换成filepath指定的内容

对于 INSERT AS SELECT这样额外的load操作在Hive 3.0 及之后版本支持,因为Hive 内部需要重写load

  • 如果表中有分区,但是load指令中没有指定,load方式将会转成INSERT AS SELECT,并认为最后的colums是分区的columns,如果文件不符合期待的模式,将会出错

  • filepath 可以包含子文件目录,其中的子文件都需符合schema
  • inputformat 可以是hive的任何输入格式 text, ORC等
  • serde 可以和Hive的SERDE关联
  • inputformat 和serde都区分大小写

Inserting data into Hive Tables from queries

语法

 1 # 标准语法:
2 INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
3 INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
4
5 # 扩展内容(多个insert):
6 FROM from_statement
7 INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
8 [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2]
9 [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;
10 FROM from_statement
11 INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
12 [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2]
13 [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] ...;
14
15 Hive extension (dynamic partition inserts):
16 INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
17 INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;

摘要

  • INSERT OVERWRITE 将会覆盖表或分区中的任何存在的额数据

    • 除非使用 IF NOT EXISTS ,不会插入新的数据,也不回删除原始数据(hive 0.9.0)
    • hive 版本2.3.0,如果设置表属性TBLPROPERTIES ("auto.purge"="true") ,当运行INSERT OVERWRITE 时,原先的数据不会被扔到垃圾堆中,该设置适合管理表
  • INSERT INTO将会追加到表或分区中,保留存在数据的完整性(HIVE 0.8)
  • hive(0.13.0)之后,建表时指定TBLPROPERTIES ("immutable"="true"),表可以被设置成不可改变 :当表中没有数据时,可以插入;当表中存在数据时,通过insert into追加数据无效,但是INSERT OVERWRITE仍然起作用
  • 目前OVERWRITE 关键字是强制的,也就是说表或分区中的内容会被关联的查询输出内容替代,需要确保查询语句的输出字段内容和目标表字段顺序完全一致
  • hive(0.14)如果表的OutputFormat实现了AcidOutputFormat,INSERT OVERWRITE操作无效,可以用TRUNCATE TABLE(对于没有分区表)或者DROP PARTITION 加INSERT INTO 实现
  • hive(1.1.0),TABLE关键字可以不用写
  • hive(1.2.0), INSERT INTO T可以指定列顺序(INSERT OVERWRITE 不支持),如INSERT INTO T (z, x, c1),查看举例

动态分区插入

  • 动态分区插入时,用户可以给部分分区的说明,也就是说只需要指定分区的分区名即可分区的值可选。
  • 如果给定了分区的值,成为静态分区,否则是动态分区。
  • 每个动态分区的列名和查询的statement中的列名关联且是最后数量的相同顺序的列,意味着动态分区的创建由输入列的值决定。
  • hive(0.9.0)版本后动态分区默认开启,动态分区插入相关配置如下

Configuration property

Default

Note

hive.exec.dynamic.partition

true

Needs to be set to true to enable dynamic partition inserts

hive.exec.dynamic.partition.mode

strict

In strict mode, the user must specify at least one static partition in case the user accidentally overwrites all partitions, in nonstrict mode all partitions are allowed to be dynamic

hive.exec.max.dynamic.partitions.pernode

100

Maximum number of dynamic partitions allowed to be created in each mapper/reducer node

hive.exec.max.dynamic.partitions

1000

Maximum number of dynamic partitions allowed to be created in total

hive.exec.max.created.files

100000

Maximum number of HDFS files created by all mappers/reducers in a MapReduce job

hive.error.on.empty.partition

false

Whether to throw an exception if dynamic partition insert generates empty results

举个例子:

1 FROM page_view_stg pvs
2 INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country)
3 SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.cnt

country分区会由最后的字段(pvs.cnt)创建,提示:名称没有被使用,只使用了其中的值,在nonstrict模式中dt分区也可以被动态创建

Writing data into the firesystem from queries

Inserting values into tables from SQL

Update

Delete

Merge

hive dml语法的更多相关文章

  1. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  2. Hive SQL 语法学习与实践

    Hive 介绍 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供 ...

  3. HIVE基本语法以及HIVE分区

    HIVE小结 HIVE基本语法 HIVE和Mysql十分类似 建表规则 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name da ...

  4. [Phoenix] 三、DML语法

    摘要: 云HBASE上Phoenix支持的DML语法 从一个或者多个表中查询数据.LIMIT(或者FETCH FIRST) 在ORDER BY子句后将转换为top-N查询. 云HBASE上Phoeni ...

  5. Hive基本语法操练

    建表规则如下: CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment ...

  6. Hive 6、Hive DML(Data Manipulation Language)

    DML主要是对Hive 表中的数据进行操作的(增 删 改),但是由于Hadoop的特性,所以单条的修改.删除,其性能会非常的低所以不支持进行级操作: 主要说明一下最常用的批量插入数据较为常用的方法: ...

  7. Hive 基本语法操练(三):分区操作和桶操作

    (一)分区操作 Hive 的分区通过在创建表时启动 PARTITION BY 实现,用来分区的维度并不是实际数据的某一列,具体分区的标志是由插入内容时给定的.当要查询某一分区的内容时可以采用 WHER ...

  8. Hive 官方手册翻译 -- Hive DML(数据操纵语言)

    由 Confluence Administrator创建, 最终由 Lars Francke修改于 八月 15, 2018 原文链接 https://cwiki.apache.org/confluen ...

  9. Hive SQL语法总结

    Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,它架构在Hadoop之上,通过SQL来对数据进行操作. Hive 查询操作过程严格遵守Hadoop MapReduce 的作业 ...

随机推荐

  1. sqlilab less23-less27a

    less23 本关过滤掉了注释符号-- 和#,并且变量带入数据库时被单引号包裹.需要将后边的单引号闭合.使用and '1'='1,将其加在注入语句的末尾,使用suffix参数 less-24 以后填坑 ...

  2. webug第五关:一个优点小小的特殊的注入

    第五关:一个优点小小的特殊的注入 既然是头部注入,首先想到xff注入 出现数据库报错,而且他是直接将xff后的内容带入数据库查询

  3. CTF-流量分析笔记

    ---恢复内容开始--- 前言 做流量分析很长时间了但是一直没有系统的去总结过这类题目的做法和思路以及wireshark的使用方法,这次做题的时候突然发现了一个总结的特别好的博客,因此想趁机做个笔记总 ...

  4. linux中的fork炸弹

    学习bash脚本看到一段代码(老鸟应该知道)挺有意思,一时看不懂.该命令不需要管理员即可运行,请不要在你的机器上使用以下脚本,否则你知道你在干什么 :() { :|: & };: 参考链接:h ...

  5. MyBatis的一二级缓存

    一级缓存 一级缓存默认是开启的,生命周期和SqlSession相同.一个会话中每次执行一个查询操作时,会先查询二级缓存,如果二级缓存没查到或者二级缓存未开启就会从一级缓存中查询,如果一级缓存也未查到就 ...

  6. 解决Redis中数据不一致问题

    redis系列之数据库与缓存数据一致性解决方案 数据库与缓存读写模式策略写完数据库后是否需要马上更新缓存还是直接删除缓存? (1).如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马 ...

  7. 地图上显示点在点上标注当前点的id

    HTML: <div class="form-group field-company-state"> <div style="width:1000px; ...

  8. serialVersionUID作用是什么以及如何生成的?

    目录 正常不设置serialVersionUID 的序列化和反序列化 序列化之后,类文件增加了字段,反序列化会怎么样? 指定serialVersionUID,减少或者增加字段会发生什么? serial ...

  9. SQL注入步骤

    1.判断是否存在注入,注入是字符型还是数字型2.猜解SQL查询语句中的字段数3.确定回显的字段数4.获取当前数据库5.获取表中字段名6.下载数据

  10. CentOS6.5上增加中文字体库,确保前端WEB可以正常显示

    1 下载字体 可以在网上下载,也可以在 windows 目录下(C:\Windows\Fonts)找到对应字体,这里是从另一套系统上 copy simsun.ttf 文件. 2 查看当前系统中已安装的 ...