哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。
1 Hive基础数据类型
类型 |
Java数据类型 |
描述 |
tinyint |
byte |
8位有符号整型,-128~127 |
smallint |
short |
16位有符号整型,-32768~32767 |
int |
int |
32位有符号整型,-231 ~ 231 -1 |
bigint |
long |
64位有符号整型, -263+1 ~ 2 63 -1 |
binary |
|
二进制数据类型,目前限制位8MB |
float |
float |
32位二进制浮点型 |
double |
double |
64位二进制浮点型 |
decimal(percision,scale) |
|
10进制精确数字类型。percision:表示最多可以表示多少位数字,1<=percision<=38。scale:表示小数部分的位数,0<=scale<=38,如果不指定两个参数,则默认位decimal(10,0) |
varchar(n) |
|
变长字符类型,n为长度,1~65535 |
char(n) |
|
固定长度字符类型,n为长度,最大为255.长度不足则会填充空格,但空格不参与比较 |
string |
string |
字符串类型,目前长度为8MB |
date |
|
日期类型,格式为 yyyy-mm-dd 00:00:00.000~9999-12-31 23:59:59.999,精确到秒 |
timestamp |
|
|
boolean |
boolean |
boolean类型,取值True、False |
1.1 复杂数据类型
类型 |
定义方法 |
构造方法 |
array |
|
|
map |
|
|
struct |
|
|
https://www.douyin.com/user/MS4wLjABAAAAC5NbA1JCeuUfq9xXyi9UkRPlxTXxli4XWux9vqF46D4zcl0vlbs_8dmajmgLwAuJ?is_full_screen=0&modal_id=7037696402289380645&vid=7037406499148238091
2 数据库、表操作
2.1 创建数据库
create database if not exists cs
或
create schema cs defaultcharacter set utf8;

2.2 创建表
无分区
create table if not exists cs.article_nopar(
aid int comment '文章id',
nickname string comment '作者',
time timestamp comment '时间戳',
id_category int comment '分类id',
id_date string
)
row format delimited
fields terminated by '\t'
lines terminated by '\n';
有分区
create table if not exists cs.article(
aid int comment '文章id',
nickname string comment '作者',
time timestamp comment '时间戳'
)
partitioned by (id_category int comment '分类id', id_date string)
row format delimited
fields terminated by '\t'
lines terminated by '\n';
row format delimited
: 用来设置创建的表在加载数据的时候,支持的列分隔符。
fields terminated by
: 字段与字段之间的分隔符。
lines terminated by
: 设置每行数据结尾的字符。
2.3 删除表
删除表
drop table cs.article;
仅删除表中数据,保留表结构
truncate table cs.article;
2.4 修改表
表重命名
alter table cs.article rename to cs.article1;
增加表字段
# 添加email
alter table cs.article add columns (a_type string);
2.5 查表
正则匹配查找表
show tables '*ar*';
查看表结构
desc cs.article;

查看所有表

3 数据导入
3.1 本地文件系统导入
首先,我们在本地文件系统创建测试内容
vim /home/charles/article.txt
1 灰太狼 1676650431 2 2022-02-18
2 有勇气的牛排 1676650432 2 2022-02-19
3 导演 1676650433 1 2022-02-20
然后在hive终端执行
load data local inpath '/home/charles/article.txt' into table cs.article_nopar;
查看导入的数据
hdfs dfs -cat /user/hive/warehouse/cs.db/article_nopar/article.txt;
truncate table cs.article_nopar;
select * from cs.article_nopar;
未分区数据导入有分区表
set hive.exec.dynamic.partition=true; -- 开启动态分区
set hive.exec.dynamic.partition.mode=nonstrict;
4 常用参数
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=10000;
set hive.exec.max.dynamic.partitions.pernode=10000;
set mapred.child.java.opts=-Xmx8000m;
set mapreduce.map.java.opts=-Xmx8096m;
set mapreduce.reduce.java.opts=-Xmx8096m;
set mapreduce.map.memory.mb=8096;
set mapreduce.reduce.memory.mb=8096;
set es.mapping.date.rich=false
5 动态分区
动态分区(dynamic partition): 指在插入数据到多个分散分区时,自动进行分区数据填充。
静态分区(static partition):分区由用户决定。
注意事项
- 动态分区在insert数据的时候,分区字段要放在插入字段的最后面,同时要和指定的分区字段的顺序一致。
- 尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
- 动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。
- 动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。
- 动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数:hive.exec.dynamic.partition.mode。
- hive用了动态分区,若select语句无数据,则insert overwrite并不会覆盖。因为动态分区由select决定,select语句无数据,分区也无法确定,故无法实现动态覆盖。此时想要修正表数据,需要手动删除该分区。
参数配置:
5.1 是否允许动态分区
使用动态分区时候,该参数必须设置成true
set hive.exec.dynamic.partition=true;
5.2 动态分区的模式设置
默认值:strict
strict模式:表示必须指定至少一个分区为静态分区。
nonstrict模式:表示允许所有的分区字段都可以使用动态分区。
set hive.exec.dynamic.partition.mode=nonstrict;
5.3 单个节点上的mapper/reducer允许创建的最大分区
默认值:100
在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。
set hive.exec.max.dynamic.partitions.pernode=1000;
5.4 允许动态分区的最大数量
默认值:1000
在所有执行MR的节点上,最大一共可以创建多少个动态分区。
set hive.exec.max.dynamic.partitions=1500;
5.5 一个mapreduce作业能创建的HDFS文件最大数
默认值:100000
整个MR Job中,最大可以创建多少个HDFS文件。
set hive.exec.max.created.files=100000;
5.6 在动态分区插入产生空结果时是否抛出异常
默认值:false
当有空分区生成时,是否抛出异常。一般不需要设置。
set hive.error.on.empty.partition=false;
6 中文乱码
修改mysql数据库
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
参考地址:
- https://www.helloworld.net/p/1015206641
- https://blog.csdn.net/qq_34224565/article/details/124869902
<p><font face="楷体,华文行楷,隶书,黑体" color="red" size="4"><strong>哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮</strong></font></p>
<p><font face="楷体,华文行楷,隶书,黑体" color="blue" size="4"><strong>有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。</strong></font></p>
<h2><a id="1_Hive_4"></a>1 Hive基础数据类型</h2>
<table>
<thead>
<tr>
<th>类型</th>
<th>Java数据类型</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>tinyint</td>
<td>byte</td>
<td>8位有符号整型,-128~127</td>
</tr>
<tr>
<td>smallint</td>
<td>short</td>
<td>16位有符号整型,-32768~32767</td>
</tr>
<tr>
<td>int</td>
<td>int</td>
<td>32位有符号整型,-2<sup>31</sup> ~ 2<sup>31</sup> -1</td>
</tr>
<tr>
<td>bigint</td>
<td>long</td>
<td>64位有符号整型, -2<sup>63</sup>+1 ~ 2 <sup>63</sup> -1</td>
</tr>
<tr>
<td>binary</td>
<td></td>
<td>二进制数据类型,目前限制位8MB</td>
</tr>
<tr>
<td>float</td>
<td>float</td>
<td>32位二进制浮点型</td>
</tr>
<tr>
<td>double</td>
<td>double</td>
<td>64位二进制浮点型</td>
</tr>
<tr>
<td>decimal(percision,scale)</td>
<td></td>
<td>10进制精确数字类型。percision:表示最多可以表示多少位数字,1<=percision<=38。scale:表示小数部分的位数,0<=scale<=38,如果不指定两个参数,则默认位decimal(10,0)</td>
</tr>
<tr>
<td>varchar(n)</td>
<td></td>
<td>变长字符类型,n为长度,1~65535</td>
</tr>
<tr>
<td>char(n)</td>
<td></td>
<td>固定长度字符类型,n为长度,最大为255.长度不足则会填充空格,但空格不参与比较</td>
</tr>
<tr>
<td>string</td>
<td>string</td>
<td>字符串类型,目前长度为8MB</td>
</tr>
<tr>
<td>date</td>
<td></td>
<td>日期类型,格式为 yyyy-mm-dd 00:00:00.000~9999-12-31 23:59:59.999,精确到秒</td>
</tr>
<tr>
<td>timestamp</td>
<td></td>
<td></td>
</tr>
<tr>
<td>boolean</td>
<td>boolean</td>
<td>boolean类型,取值True、False</td>
</tr>
</tbody>
</table>
<h3><a id="11__24"></a>1.1 复杂数据类型</h3>
<table>
<thead>
<tr>
<th>类型</th>
<th>定义方法</th>
<th>构造方法</th>
</tr>
</thead>
<tbody>
<tr>
<td>array</td>
<td></td>
<td></td>
</tr>
<tr>
<td>map</td>
<td></td>
<td></td>
</tr>
<tr>
<td>struct</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>https://www.douyin.com/user/MS4wLjABAAAAC5NbA1JCeuUfq9xXyi9UkRPlxTXxli4XWux9vqF46D4zcl0vlbs_8dmajmgLwAuJ?is_full_screen=0&modal_id=7037696402289380645&vid=7037406499148238091</p>
<h2><a id="2__32"></a>2 数据库、表操作</h2>
<h3><a id="21__34"></a>2.1 创建数据库</h3>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">create</span> database if <span class="hljs-keyword">not</span> <span class="hljs-keyword">exists</span> cs
</code></div></pre>
<p>或</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">create</span> schema cs <span class="hljs-keyword">default</span><span class="hljs-type">character</span> <span class="hljs-keyword">set</span> utf8;
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/dc7b329d702231f631b3d34b8cf8e722.png" alt="image.png" /></p>
<h3><a id="22__47"></a>2.2 创建表</h3>
<p>无分区</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> if <span class="hljs-keyword">not</span> <span class="hljs-keyword">exists</span> cs.article_nopar(
aid <span class="hljs-type">int</span> comment <span class="hljs-string">'文章id'</span>,
nickname string comment <span class="hljs-string">'作者'</span>,
<span class="hljs-type">time</span> <span class="hljs-type">timestamp</span> comment <span class="hljs-string">'时间戳'</span>,
id_category <span class="hljs-type">int</span> comment <span class="hljs-string">'分类id'</span>,
id_date string
)
<span class="hljs-type">row</span> format delimited
fields terminated <span class="hljs-keyword">by</span> <span class="hljs-string">'\t'</span>
lines terminated <span class="hljs-keyword">by</span> <span class="hljs-string">'\n'</span>;
</code></div></pre>
<p>有分区</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> if <span class="hljs-keyword">not</span> <span class="hljs-keyword">exists</span> cs.article(
aid <span class="hljs-type">int</span> comment <span class="hljs-string">'文章id'</span>,
nickname string comment <span class="hljs-string">'作者'</span>,
<span class="hljs-type">time</span> <span class="hljs-type">timestamp</span> comment <span class="hljs-string">'时间戳'</span>
)
partitioned <span class="hljs-keyword">by</span> (id_category <span class="hljs-type">int</span> comment <span class="hljs-string">'分类id'</span>, id_date string)
<span class="hljs-type">row</span> format delimited
fields terminated <span class="hljs-keyword">by</span> <span class="hljs-string">'\t'</span>
lines terminated <span class="hljs-keyword">by</span> <span class="hljs-string">'\n'</span>;
</code></div></pre>
<p><code>row format delimited</code>: 用来设置创建的表在加载数据的时候,支持的列分隔符。</p>
<p><code>fields terminated by</code>: 字段与字段之间的分隔符。</p>
<p><code>lines terminated by</code>: 设置每行数据结尾的字符。</p>
<h3><a id="23__80"></a>2.3 删除表</h3>
<p>删除表</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">drop</span> <span class="hljs-keyword">table</span> cs.article;
</code></div></pre>
<p>仅删除表中数据,保留表结构</p>
<pre><code class="lang-powershell">truncate table cs.article;
</code></pre>
<h3><a id="24__90"></a>2.4 修改表</h3>
<p>表重命名</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">alter</span> <span class="hljs-keyword">table</span> cs.article rename <span class="hljs-keyword">to</span> cs.article1;
</code></div></pre>
<p>增加表字段</p>
<pre><div class="hljs"><code class="lang-sql"># 添加email
<span class="hljs-keyword">alter</span> <span class="hljs-keyword">table</span> cs.article <span class="hljs-keyword">add</span> columns (a_type string);
</code></div></pre>
<h3><a id="25__102"></a>2.5 查表</h3>
<p>正则匹配查找表</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">show</span> tables <span class="hljs-string">'*ar*'</span>;
</code></div></pre>
<p>查看表结构</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">desc</span> cs.article;
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/e17bd7ced3ca169a317a79d30ef87aa4.png" alt="image.png" /></p>
<p>查看所有表<br />
<img src="https://static.couragesteak.com/article/f0fbe053cf117ec9531f8a2e9ff06b6e.png" alt="image.png" /></p>
<h2><a id="3__119"></a>3 数据导入</h2>
<h3><a id="31__120"></a>3.1 本地文件系统导入</h3>
<p>首先,我们在本地文件系统创建测试内容</p>
<pre><div class="hljs"><code class="lang-shell">vim /home/charles/article.txt
</code></div></pre>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-number">1</span> 灰太狼 <span class="hljs-number">1676650431</span> <span class="hljs-number">2</span> <span class="hljs-number">2022</span><span class="hljs-number">-02</span><span class="hljs-number">-18</span>
<span class="hljs-number">2</span> 有勇气的牛排 <span class="hljs-number">1676650432</span> <span class="hljs-number">2</span> <span class="hljs-number">2022</span><span class="hljs-number">-02</span><span class="hljs-number">-19</span>
<span class="hljs-number">3</span> 导演 <span class="hljs-number">1676650433</span> <span class="hljs-number">1</span> <span class="hljs-number">2022</span><span class="hljs-number">-02</span><span class="hljs-number">-20</span>
</code></div></pre>
<p>然后在hive终端执行</p>
<pre><div class="hljs"><code class="lang-sql">load data <span class="hljs-keyword">local</span> inpath <span class="hljs-string">'/home/charles/article.txt'</span> <span class="hljs-keyword">into</span> <span class="hljs-keyword">table</span> cs.article_nopar;
</code></div></pre>
<p>查看导入的数据</p>
<pre><div class="hljs"><code class="lang-shell">hdfs dfs -cat /user/hive/warehouse/cs.db/article_nopar/article.txt;
</code></div></pre>
<p>truncate table cs.article_nopar;</p>
<pre><code class="lang-powershell">select * from cs.article_nopar;
</code></pre>
<p>未分区数据导入有分区表</p>
<pre><code class="lang-powershell">set hive.exec.dynamic.partition=true; -- 开启动态分区
set hive.exec.dynamic.partition.mode=nonstrict;
</code></pre>
<h2><a id="4__155"></a>4 常用参数</h2>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-comment">-- 是否允许动态分区 </span>
<span class="hljs-keyword">set</span> hive.exec.dynamic.partition<span class="hljs-operator">=</span><span class="hljs-literal">true</span>;
<span class="hljs-comment">-- 动态分区的模式设置</span>
<span class="hljs-keyword">set</span> hive.exec.dynamic.partition.mode<span class="hljs-operator">=</span>nonstrict;
<span class="hljs-comment">-- 允许动态分区的最大数量</span>
<span class="hljs-keyword">set</span> hive.exec.max.dynamic.partitions<span class="hljs-operator">=</span><span class="hljs-number">10000</span>;
<span class="hljs-comment">-- 单个节点上的mapper/reducer允许创建的最大分区</span>
<span class="hljs-keyword">set</span> hive.exec.max.dynamic.partitions.pernode<span class="hljs-operator">=</span><span class="hljs-number">10000</span>;
<span class="hljs-keyword">set</span> mapred.child.java.opts<span class="hljs-operator">=</span><span class="hljs-operator">-</span>Xmx8000m;
<span class="hljs-keyword">set</span> mapreduce.map.java.opts<span class="hljs-operator">=</span><span class="hljs-operator">-</span>Xmx8096m;
<span class="hljs-keyword">set</span> mapreduce.reduce.java.opts<span class="hljs-operator">=</span><span class="hljs-operator">-</span>Xmx8096m;
<span class="hljs-keyword">set</span> mapreduce.map.memory.mb<span class="hljs-operator">=</span><span class="hljs-number">8096</span>;
<span class="hljs-keyword">set</span> mapreduce.reduce.memory.mb<span class="hljs-operator">=</span><span class="hljs-number">8096</span>;
<span class="hljs-keyword">set</span> es.mapping.date.rich<span class="hljs-operator">=</span><span class="hljs-literal">false</span>
</code></div></pre>
<h2><a id="5__175"></a>5 动态分区</h2>
<p><strong>动态分区(dynamic partition):</strong> 指在插入数据到多个分散分区时,自动进行分区数据填充。</p>
<p><strong>静态分区(static partition)</strong>:分区由用户决定。</p>
<h3><a id="_181"></a>注意事项</h3>
<ul>
<li>动态分区在insert数据的时候,分区字段要放在插入字段的最后面,同时要和指定的分区字段的顺序一致。</li>
<li>尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。</li>
<li>动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。</li>
<li>动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。</li>
<li>动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数:hive.exec.dynamic.partition.mode。</li>
<li>hive用了动态分区,若select语句无数据,则insert overwrite并不会覆盖。因为动态分区由select决定,select语句无数据,分区也无法确定,故无法实现动态覆盖。此时想要修正表数据,需要手动删除该分区。</li>
</ul>
<p>参数配置:</p>
<h3><a id="51__192"></a>5.1 是否允许动态分区</h3>
<p>使用动态分区时候,该参数必须设置成true</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">set</span> hive.exec.dynamic.partition<span class="hljs-operator">=</span><span class="hljs-literal">true</span>;
</code></div></pre>
<h3><a id="52__197"></a>5.2 动态分区的模式设置</h3>
<p>默认值:strict<br />
strict模式:表示必须指定至少一个分区为静态分区。<br />
nonstrict模式:表示允许所有的分区字段都可以使用动态分区。</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">set</span> hive.exec.dynamic.partition.mode<span class="hljs-operator">=</span>nonstrict;
</code></div></pre>
<h3><a id="53_mapperreducer_204"></a>5.3 单个节点上的mapper/reducer允许创建的最大分区</h3>
<p>默认值:100<br />
在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">set</span> hive.exec.max.dynamic.partitions.pernode<span class="hljs-operator">=</span><span class="hljs-number">1000</span>;
</code></div></pre>
<h3><a id="54__210"></a>5.4 允许动态分区的最大数量</h3>
<p>默认值:1000<br />
在所有执行MR的节点上,最大一共可以创建多少个动态分区。</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">set</span> hive.exec.max.dynamic.partitions<span class="hljs-operator">=</span><span class="hljs-number">1500</span>;
</code></div></pre>
<h3><a id="55_mapreduceHDFS_216"></a>5.5 一个mapreduce作业能创建的HDFS文件最大数</h3>
<p>默认值:100000<br />
整个MR Job中,最大可以创建多少个HDFS文件。</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">set</span> hive.exec.max.created.files<span class="hljs-operator">=</span><span class="hljs-number">100000</span>;
</code></div></pre>
<h3><a id="56__223"></a>5.6 在动态分区插入产生空结果时是否抛出异常</h3>
<p>默认值:false<br />
当有空分区生成时,是否抛出异常。一般不需要设置。</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">set</span> hive.error.on.empty.partition<span class="hljs-operator">=</span><span class="hljs-literal">false</span>;
</code></div></pre>
<h2><a id="6__230"></a>6 中文乱码</h2>
<p>修改mysql数据库</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">alter</span> <span class="hljs-keyword">table</span> COLUMNS_V2 modify <span class="hljs-keyword">column</span> COMMENT <span class="hljs-type">varchar</span>(<span class="hljs-number">256</span>) <span class="hljs-type">character</span> <span class="hljs-keyword">set</span> utf8;
<span class="hljs-keyword">alter</span> <span class="hljs-keyword">table</span> TABLE_PARAMS modify <span class="hljs-keyword">column</span> PARAM_VALUE <span class="hljs-type">varchar</span>(<span class="hljs-number">4000</span>) <span class="hljs-type">character</span> <span class="hljs-keyword">set</span> utf8;
</code></div></pre>
<p>参考地址:</p>
<ul>
<li>https://www.helloworld.net/p/1015206641</li>
<li>https://blog.csdn.net/qq_34224565/article/details/124869902</li>
</ul>
留言