Hive基础:修订间差异
无编辑摘要 |
无编辑摘要 |
||
第107行: | 第107行: | ||
=== Table === | === Table === | ||
create 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=== | |||
===Data=== | |||
====Load==== | ==== Load==== | ||
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)] | LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)] | ||
====Load CSV==== | ====Load CSV==== | ||
<nowiki>#</nowiki> 注意:Load CSV 并无报错,但导入皆为 NULL。一般 CSV 导入模式是先导入成 textfile, 之后再从临时表 insert 成 parquet。 | <nowiki>#</nowiki> 注意:Load CSV 并无报错,但导入皆为 NULL。一般 CSV 导入模式是先导入成 textfile, 之后再从临时表 insert 成 parquet。 | ||
*有 LOCAL 表示从本地文件系统加载(文件会被拷贝到HDFS中) | *有 LOCAL 表示从本地文件系统加载(文件会被拷贝到HDFS中) | ||
*无 LOCAL 表示从 HDFS 中加载数据(注意:文件直接被移动到 Hive 相应库下,而不是拷贝。) | * 无 LOCAL 表示从 HDFS 中加载数据(注意:文件直接被移动到 Hive 相应库下,而不是拷贝。) | ||
*OVERWRITE 表示是否覆盖表中数据(或指定分区的数据)(没有 OVERWRITE 则 APPEND。) | *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 格式 | 另一种处理方式:将 CSV 格式转换为 Hive 格式 | ||
#cat bank.csv | sed "s/,/$PA/" > bank.hive # PA=OX001 | #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; | # load data local inpath '/u01/data/bank.hive' <s>overwrite</s> into table test.bank_data; | ||
====Insert==== | ====Insert==== | ||
hive> insert into test.test values ('1000', 'Hello World!'); | 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 中出现 | ||
*子查询表必须有别名 | * 子查询表必须有别名 | ||
[[分类:Develop]] | [[分类:Develop]] | ||
[[分类:Hadoop]] | [[分类:Hadoop]] | ||
[[分类:Hive]] | [[分类:Hive]] |
2023年2月15日 (三) 11:47的版本
参数设置
优先级: 配置文件 < 命令行参数 < 终端里输入命令
注意某些系统级的参数, 例如 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 数据类型 | Java 数据类型 |
---|---|
TINYINT | byte |
SMALINT | short |
INT | int |
BIGINT | long |
BOOLEAN | boolean |
FLOAT | float |
DOUBLE | double |
STRING | string |
TIMESTAMP
String 类型相当于数据库的 varchar 类型, 该类型是一个可变的字符串,理论上它可以存储 2GB 的字符数
集合数据类型
- 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 格式
- cat bank.csv | sed "s/,/$PA/" > bank.hive # PA=OX001
- load data local inpath '/u01/data/bank.hive'
overwriteinto 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 中出现
- 子查询表必须有别名