Hive基础:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
 
(未显示同一用户的6个中间版本)
第44行: 第44行:
{| class="wikitable"
{| class="wikitable"
!Hive 数据类型
!Hive 数据类型
!Java 数据类型
!字节数
!范围
|-
|-
|TINYINT
|TINYINT
|byte
|1
| -128~127
|-
|-
|SMALINT
|SMALINT
|short
|2
| -32768~32767
|-
|-
|INT
|INT
|int
|4
|默认,-2147483648~2147483647
|-
|-
|BIGINT
|BIGINT
|long
|8
|18位,-9.2234e18~9.2234e18
|-
|-
|BOOLEAN
|BOOLEAN
|boolean
|1
|true/false
|-
|-
|FLOAT
|FLOAT
|float
|4
|4字节单精度浮点数
|-
|-
|DOUBLE
|DOUBLE
|double
|8
|8字节单精度浮点数
|-
|DEICIMAL
|任意精度的带符号小数
|1.23
|-
|CHAR
|固定长度字符串
|
|-
|VARCHAR
|变长
|
|-
|-
|STRING
|STRING
|string
|变长
|2G
|-
|DATE
|日期
|2000-12-31
|-
|TIMESTAMP
|时间戳,毫秒值精度
|122327493795
|-
|INTERVAL
|时间频率间隔
|
|}
|}
TIMESTAMP
String 类型相当于数据库的 varchar 类型, 该类型是一个可变的字符串,理论上它可以存储 2GB 的字符数
==== 集合数据类型 ====
==== 集合数据类型 ====


第89行: 第118行:


* 静态分区是在创建表时手动指定
* 静态分区是在创建表时手动指定
* 动态分区是通过数据来进行判断,只有在 SQL 执行时才能确定。动态分区不能使用 load 加载数据,需要使用insert into
* 动态分区是通过数据来进行判断,只有在 SQL 执行时才能确定。动态分区不能使用 load 加载数据,需要使用 insert into


默认创建的分区是静态分区,如果要指定动态分区需要配置系统参数。
默认创建的分区是静态分区,如果要指定动态分区需要配置系统参数。
第106行: 第135行:
* 分区是粗粒度的将数据隔离,分桶是更加细粒度的将数据隔离
* 分区是粗粒度的将数据隔离,分桶是更加细粒度的将数据隔离


=== 注意 ===
=== Table ===
create table test.test_csv(
  ky int,
  val string,
  ct string,
  memo string
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
;
=== Data===
 
==== Load====
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)]
 
====Load CSV====
<nowiki>#</nowiki> 注意:Load CSV 并无报错,但导入皆为 NULL。一般 CSV 导入模式是先导入成 textfile, 之后再从临时表 insert 成 parquet。
 
*有 LOCAL 表示从本地文件系统加载(文件会被拷贝到HDFS中)
* 无 LOCAL 表示从 HDFS 中加载数据(注意:文件直接被移动到 Hive 相应库下,而不是拷贝。)
*OVERWRITE 表示是否覆盖表中数据(或指定分区的数据)(没有 OVERWRITE 则 APPEND。)
*若加载同样文件名的文件,会被自动重命名
test_csv.csv
ky,val,ct,memo
1001,Hello,2021-1-1,Test
0002,Hi,2021-1-2 1:00,test1
1002,"Hello, World!",2021-1-3 10:00,test2
1003,"Hi, ada""'
return",2021-1-4 15:00,Test message'.
1004,"Hello, BI.",2021-1-10,
 
load data local inpath '/u01/data/test_csv.csv' overwrite into table test.test_csv;
 
Hive Load Data 时,并不去掉第一行标题(导入后格式与源文件相同)。一般提前处理,或者使用下面语句:
 
alter table test.test_csv set TBLPROPERTIES('skip.header.line.count'='1');
 
==== Load Hive ====
另一种处理方式:将 CSV 格式转换为 Hive 格式
 
#cat bank.csv | sed "s/,/$PA/" > bank.hive    # PA=OX001
# load data local inpath '/u01/data/bank.hive' <s>overwrite</s> into table test.bank_data;
 
====Insert====
hive> create table test ( key string, val string);
hive> insert into test.test values ('1000', 'Hello World!');
hive> insert into test.test values ('1010', 'Hello Hive!');
插入操作,每条语句均会产生一个文件:000000_0, 000000_0_copy_1


* order by 中的字段, 必须在 select 中出现
===注意===
*order by 中的字段, 必须在 select 中出现
* 子查询表必须有别名
* 子查询表必须有别名



2023年2月23日 (四) 22:52的最新版本

参数设置

优先级: 配置文件 < 命令行参数 < 终端里输入命令

注意某些系统级的参数, 例如 log4j 的设定必须用前两种方式设定, 因为那些参数的读取在会话建立以前已经完成了。

  • 配置文件方式 hive-default.xml 和 hive-site.xml
  • 命令行参数方式 启动 Hive 时,hive -hiveconf mapred.reduce.tasks=10
  • 终端里输入命令

set 查看所有配置

set xxx 查看xxx参数的值

set xxx 1 设置xxx参数的值

基础命令

hive -e “sql语句”

hive -f “sql文件路径”

分割符

Hive中默认的分割符为:

  列:^A

  行:\n

在数据文件中显示为:"1000^AHello, World!\n",数据中如果包含:"\001","\n"等分隔符,需要提前处理掉。

如果需要自定义分隔符,需要设置:

ROW FORMAT DELIMITED

  FIELDS TERMINATED BY '\t'

  LINES TERMINATED BY '\n'

数据类型

基本数据类型

Hive 数据类型 字节数 范围
TINYINT 1 -128~127
SMALINT 2 -32768~32767
INT 4 默认,-2147483648~2147483647
BIGINT 8 18位,-9.2234e18~9.2234e18
BOOLEAN 1 true/false
FLOAT 4 4字节单精度浮点数
DOUBLE 8 8字节单精度浮点数
DEICIMAL 任意精度的带符号小数 1.23
CHAR 固定长度字符串
VARCHAR 变长
STRING 变长 2G
DATE 日期 2000-12-31
TIMESTAMP 时间戳,毫秒值精度 122327493795
INTERVAL 时间频率间隔

集合数据类型

  • STRUCT struct<street:string, city:string>
  • MAP map<string, int>
  • Array array<string>

索引、分区与分桶

索引

Hive从0.7.0版本开始加入了索引,0.8版本后增加 bitmap 索引。索引表不会自动 rebuild,如果表有数据新增或删除,那么必须手动 rebuild 索引表数据

分区

表分区是指将数据按照物理分层的方式进行区分开,加快查询的速度,同时也起到数据快照的作用。可以指定单个字段也可以指定多个字段;

  • 静态分区是在创建表时手动指定
  • 动态分区是通过数据来进行判断,只有在 SQL 执行时才能确定。动态分区不能使用 load 加载数据,需要使用 insert into

默认创建的分区是静态分区,如果要指定动态分区需要配置系统参数。

当单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,采用分桶技术将数据更细粒度的划分和管理。

分桶关键字:BUCKET

指定分桶的字段:clustered by (uid)

区别

  • 分区使用的是表外字段,分桶使用的是表内字段
  • 分桶是更细粒度的划分、管理数据,更多用来做数据抽样、JOIN操作
  • 分区是粗粒度的将数据隔离,分桶是更加细粒度的将数据隔离

Table

create table test.test_csv(
  ky int,
  val string,
  ct string,
  memo string
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
;

Data

Load

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

Load CSV

# 注意:Load CSV 并无报错,但导入皆为 NULL。一般 CSV 导入模式是先导入成 textfile, 之后再从临时表 insert 成 parquet。

  • 有 LOCAL 表示从本地文件系统加载(文件会被拷贝到HDFS中)
  • 无 LOCAL 表示从 HDFS 中加载数据(注意:文件直接被移动到 Hive 相应库下,而不是拷贝。)
  • OVERWRITE 表示是否覆盖表中数据(或指定分区的数据)(没有 OVERWRITE 则 APPEND。)
  • 若加载同样文件名的文件,会被自动重命名

test_csv.csv

ky,val,ct,memo
1001,Hello,2021-1-1,Test
0002,Hi,2021-1-2 1:00,test1
1002,"Hello, World!",2021-1-3 10:00,test2
1003,"Hi, ada""'
return",2021-1-4 15:00,Test message'.
1004,"Hello, BI.",2021-1-10,

load data local inpath '/u01/data/test_csv.csv' overwrite into table test.test_csv;

Hive Load Data 时,并不去掉第一行标题(导入后格式与源文件相同)。一般提前处理,或者使用下面语句:

alter table test.test_csv set TBLPROPERTIES('skip.header.line.count'='1');

Load Hive

另一种处理方式:将 CSV 格式转换为 Hive 格式

  1. cat bank.csv | sed "s/,/$PA/" > bank.hive # PA=OX001
  2. load data local inpath '/u01/data/bank.hive' overwrite into table test.bank_data;

Insert

hive> create table test ( key string, val string);
hive> insert into test.test values ('1000', 'Hello World!');
hive> insert into test.test values ('1010', 'Hello Hive!');

插入操作,每条语句均会产生一个文件:000000_0, 000000_0_copy_1

注意

  • order by 中的字段, 必须在 select 中出现
  • 子查询表必须有别名