Hive基础:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
第89行: 第89行:


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


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


=== Table ===
=== Table ===
create table if not exists bank_data
(
  age            BIGINT comment '年龄',
  job            STRING comment '工作类型',
  marital        STRING comment '婚否',
  education      STRING comment '教育程度',
  credit          STRING comment '是否有信用卡',
  housing        STRING comment '是否有房贷',
  loan            STRING comment '是否有贷款',
  contact        STRING comment '联系方式',
  month          STRING comment '月份',
  day_of_week    STRING comment '星期几',
  duration        STRING comment '持续时间',
  campaign        BIGINT comment '本次活动联系的次数',
  pdays          DOUBLE comment '与上一次联系的时间间隔',
  previous        DOUBLE comment '之前与客户联系的次数',
  poutcome        STRING comment '之前市场活动的结果',
  emp_var_rate    DOUBLE comment '就业变化速率',
  cons_price_idx  DOUBLE comment '消费者物价指数',
  cons_conf_idx  DOUBLE comment '消费者信心指数',
  euribor3m      DOUBLE comment '欧元存款利率',
  nr_employed    DOUBLE comment '职工人数',
  fixed_deposit  BIGINT comment '是否有定期存款'
);
===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 ...)]


example: load data local inpath '/u01/data/bank.hive' <s>overwrite</s> into table test.bank
====Load CSV====
 
<nowiki>#</nowiki> 注意:Load CSV 并无报错,但导入皆为 NULL。一般 CSV 导入模式是先导入成 textfile, 之后再从临时表 insert 成 parquet。
==== Load CSV ====
<nowiki>#</nowiki> 注意:Load CSV 并无报错,但导入皆为 NULL。一般 CSV 导入模式是先导入成 textfile, 之后再从临时表导入成 parquet。


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


另一种处理方式:将 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> insert into test.test values ('1000', 'Hello World!');


=== 注意 ===
===注意===


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


[[分类:Develop]]
[[分类:Develop]]
[[分类:Hadoop]]
[[分类:Hadoop]]
[[分类:Hive]]
[[分类:Hive]]

2023年2月14日 (二) 23:23的版本

参数设置

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

注意某些系统级的参数, 例如 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 if not exists bank_data
(
 age             BIGINT comment '年龄',
 job             STRING comment '工作类型',
 marital         STRING comment '婚否',
 education       STRING comment '教育程度',
 credit          STRING comment '是否有信用卡',
 housing         STRING comment '是否有房贷',
 loan            STRING comment '是否有贷款',
 contact         STRING comment '联系方式',
 month           STRING comment '月份',
 day_of_week     STRING comment '星期几',
 duration        STRING comment '持续时间',
 campaign        BIGINT comment '本次活动联系的次数',
 pdays           DOUBLE comment '与上一次联系的时间间隔',
 previous        DOUBLE comment '之前与客户联系的次数',
 poutcome        STRING comment '之前市场活动的结果',
 emp_var_rate    DOUBLE comment '就业变化速率',
 cons_price_idx  DOUBLE comment '消费者物价指数',
 cons_conf_idx   DOUBLE comment '消费者信心指数',
 euribor3m       DOUBLE comment '欧元存款利率',
 nr_employed     DOUBLE comment '职工人数',
 fixed_deposit   BIGINT comment '是否有定期存款'
);

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。)
  • 若加载同样文件名的文件,会被自动重命名

另一种处理方式:将 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> insert into test.test values ('1000', 'Hello World!');

注意

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