靡不有初,鲜克有终,路漫漫其修远兮,吾将上下而求索。
先把安装包下载。然后解压:(解压到路径/usr/local下)
tar -xzvf apache-hive-1.2.1-bin.tar.gz
vim /etc/profile
export HIVE_HOME=/usr/local/apache-hive-1.2.1-bin
export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/conf
source /etc/profile 使环境变量生效
1)创建配置文件
cp $HIVE_HOME/conf/hive-default.xml.template $HIVE_HOME/conf/hive-site.xml
cp $HIVE_HOME/conf/hive-env.sh.template $HIVE_HOME/conf/hive-env.sh
第一段代码 cp $HIVE_HOME/conf/hive-default.xml.template $HIVE_HOME/conf/hive-site.xml
将 Hive 的默认配置文件模板 hive-default.xml.template
复制到 $HIVE_HOME/conf/hive-site.xml
。通过这个操作,我们创建了一个名为 hive-site.xml
的配置文件,它将包含实际的配置值,可以根据需求进行修改。
第二段代码 cp $HIVE_HOME/conf/hive-env.sh.template $HIVE_HOME/conf/hive-env.sh
复制了 Hive 的环境变量配置文件模板 hive-env.sh.template
到 $HIVE_HOME/conf/hive-env.sh
。这个文件可以用于设置 Hive 的运行环境变量和其他配置参数。
2)修改hive-env.sh
vim hive-env.sh
export HADOOP_HOME=/usr/local/hadoop-2.6.4
export HIVE_CONF_DIR=/usr/local/apache-hive-1.2.1-bin/conf
3)修改 hive-site.xml
hive-site.xml的修改内容见修改 hive-site.xml文档
4)上传jdbc包
将mysql-connector-java包上传到$HIVE_HOME/lib下
5)将hive下的新版本jline的JAR包拷贝到hadoop下
find / -name "jline*"找到hadoop中jline包位置如下:
/usr/local/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar
hive 中的jline位置为/usr/local/apache-hive-1.2.1-bin/lib/jline-2.12.jar
将hive中的jline复制到hadoop中(需要先把hadoop中的jline做个备份)
mv /usr/local/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar
/usr/local/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar.bak(备份)
cp /usr/local/apache-hive-1.2.1-bin/lib/jline-2.12.jar
/usr/local/hadoop-2.6.4/share/hadoop/yarn/lib(这两行是将hive中的jline复制到hadoop中)
6)启动hive需要开启mysql的远程登录
use mysql;
update user set host = '%' where user = 'root';
select host, user from user;
flush privileges;
4、启动Hadoop集群
start-all.sh
5、启动hive
直接在输入hive
6、向hive中导入数据
建表语句如下:
create table user_login(
name varchar(50),
time varchar(50))
row format delimited fields terminated by ',';
导入数据语句如下:
load data inpath '/user/user_login.txt' into table user_login;
7、创建成绩表,创建成绩分区表
create table score(
course varchar(50),
name varchar(50),
score int)
row format delimited fields terminated by ' ';
create table part_score(
course varchar(50),
name varchar(50),
score int)
partitioned by(ds varchar(50))
row format delimited
fields terminated by ' ';
修改数据库字符集为支持存储你想插入的特定字符。可以执行以下命令将数据库字符集修改为utf8mb4:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改名为 "student" 的表中的 "course" 列的数据类型为 VARCHAR(50)
ALTER TABLE student MODIFY COLUMN course VARCHAR(50);
修改列的字符集
ALTER TABLE student MODIFY COLUMN course VARCHAR(50) CHARACTER SET utf8;
加载数据到成绩表:
load data inpath '/data/score.txt' into table score;
加载数据到分区成绩表:(通过load加载数据到分区表,hive不会自动分区
load data inpath '/data/score.txt' into table part_score partition(ds='math');
select * from part_score where ds='math';
通过insert插入数据到分区表:
重新插入数据进入分区表之前需要删除已经插入的数据:
truncate table part_score;
insert into part_score partition(ds='math') select * from score where course='math';
第一段代码 truncate table part_score;
是对表 part_score
进行截断操作,即清空表中的所有数据。执行这个命令后,表 part_score
中的数据将被完全删除,但表的结构和分区信息将保持不变。
第二段代码 insert into part_score partition(ds='math') select * from score where course='math';
是将符合条件的数据从表 score
中选取出来,并插入到表 part_score
的 ds
分区中,其中分区值为 'math'
。
具体解释如下:
insert into part_score partition(ds='math')
表示将数据插入到 part_score
表的 ds
分区,分区值为 'math'
。select * from score where course='math'
表示从表 score
中选择所有满足条件 course='math'
的数据。score
中满足条件的数据插入到表 part_score
的 ds='math'
分区中。
使用hdfs的cat命令查看到的数据也是只有math的数据:
查看分区情况:
create table buck_score(
course varchar(50),
name varchar(50),
score int)
clustered by(name) into 3 buckets
row format delimited fields terminated by ' ';
向带桶的表中插入数据:
加载数据到带桶的成绩表:(通过load加载数据到带桶的表,hive不会自动分桶)
create table buck_score
表示创建一个名为 buck_score
的表。(course varchar(50), name varchar(50), score int)
定义了表的列和它们的数据类型。clustered by(name) into 3 buckets
表示将表按照 name
列进行分桶,并将数据分散到 3 个桶中。分桶操作可以提高查询性能,将相关数据存储在同一个桶中,以便更有效地执行基于该列的查询操作。row format delimited fields terminated by ' '
指定了行格式和字段分隔符。在这个例子中,使用空格作为字段之间的分隔符。insert into buck_score select * from score;
insert into buck_score
表示将数据插入到表 buck_score
中。select * from score
表示从表 score
中选择所有的数据。设置动态分区:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert into table part_score partition(ds) select course,name,score,course from score;
这段代码是在 Hive 中执行动态分区插入操作,将表 score
中的数据按照 ds
分区动态插入到表 part_score
中。
具体解释如下:
set hive.exec.dynamic.partition=true;
设置 Hive 的动态分区模式为开启。这样可以在插入数据时根据分区字段动态创建新的分区。set hive.exec.dynamic.partition.mode=nonstrict;
设置动态分区模式为非严格模式。这意味着在插入数据时,如果分区字段不存在,Hive 会自动创建新的分区。insert into table part_score partition(ds)
表示将数据插入到表 part_score
中,并根据 ds
字段的值进行动态分区。select course,name,score,course from score
从表 score
中选择需要插入的数据。在这个例子中,选择了 course
、name
和 score
列,并将 course
列作为 ds
分区的值。set mapred.reduce.tasks=3;
set mapred.reduce.tasks
insert overwrite local directory "/output-sortby" select uid,count(*) as cnt from sogou group by uid sort by cnt;
这段代码在 Hive 中设置了 MapReduce 的 reduce tasks 数量,并执行了数据的排序和聚合操作。
具体解释如下:
- `set mapred.reduce.tasks=3;` 设置 MapReduce 的 reduce tasks 数量为 3。这表示在执行 MapReduce 作业时,将会启动 3 个 reduce tasks 来处理数据。
- `set mapred.reduce.tasks` 是查看当前 MapReduce 的 reduce tasks 数量的配置。
接下来是插入和排序的操作:
- `insert overwrite local directory "/output-sortby"` 将结果输出到本地文件系统中的 `/output-sortby` 目录下。这个目录将会被用于存储排序后的结果。
- `select uid,count(*) as cnt from sogou group by uid sort by cnt` 从表 `sogou` 中按照 `uid` 分组并统计每个分组中的记录数量,并按照 `cnt` 列进行排序。
通过这个操作,您可以将表 `sogou` 中的数据按照 `uid` 进行分组并统计记录数量,并将结果按照记录数量进行排序,并将排序结果保存到本地文件系统的 `/output-sortby` 目录中。请确保目录的存在,并根据实际需求修改路径和排序的列名。
hdfs dfs -mkdir /output-sortby
按照班级分区,并对分区内的数据按成绩排序
set mapred.reduce.tasks=2;
insert overwrite local directory "/output-sortby" select name,course,score,class from cj distribute by class sort by score;
这段代码在 Hive 中设置了 MapReduce 的 reduce tasks 数量为 2,并执行了数据的分发和排序操作。
具体解释如下:
- `set mapred.reduce.tasks=2;` 设置 MapReduce 的 reduce tasks 数量为 2。这表示在执行 MapReduce 作业时,将会启动 2 个 reduce tasks 来处理数据。
- `insert overwrite local directory "/output-sortby"` 将结果输出到本地文件系统中的 `/output-sortby` 目录下。这个目录将会被用于存储排序后的结果。
- `select name,course,score,class from cj distribute by class sort by score` 从表 `cj` 中选择 `name`、`course`、`score` 和 `class` 列,然后按照 `class` 列进行数据分发,并按照 `score` 列进行排序。
通过这个操作,您可以将表 `cj` 中的数据按照 `class` 列进行分发,并按照 `score` 列进行排序,并将排序结果保存到本地文件系统的 `/output-sortby` 目录中。请确保目录的存在,并根据实际需求修改路径和排序的列名。同时,请注意设置的 reduce tasks 数量对结果的分区和排序有影响。
hive中有一个store表,字段分别是"商店所属人标识"(merid),“商户余额(money)”,“商店名称(name)”。求每个法人下属的商店的余额按照降序排序。
hive中的distribute by_hive中distribute_fantasticqiang的博客-CSDN博客
11 sqoop导入存在乱码问题
sqoop把hive数据导入mysql出现中文乱码_sqoop导入hive乱码_bboy枫亭的博客-CSDN博客
空白处表示的是创建的数据库使用的编码,我们要先设置这两项,然后再创建数据库。
set character_set_database=utf8;
set character_set_server=utf8;
导入语句见附件
12、从mysql导入数据导hdfs
覆盖:
sqoop import --connect jdbc:mysql://192.168.1.3:3306/test --username root --password root_password --table cj --delete-target-dir --target-dir /user/hive/warehouse/cj -m 1
追加:
sqoop import --connect jdbc:mysql://192.168.1.3:3306/test --username root --password root_password --table cj --append --target-dir /user/hive/warehouse/cj -m 1
导入到mysql
sqoop export --connect 'jdbc:mysql://192.168.1.3:3306/test?useUnicode=true&characterEncoding=utf-8' --username root --password root_password --table score --export-dir /user/hive/warehouse/school.db/score --fields-terminated-by '\t'
导出到hdfs
sqoop import --connect 'jdbc:mysql://192.168.1.3:3306/xtz?useUnicode=true&characterEncoding=utf-8' --username root --password root_password --table student3 --target-dir /user/hive/warehouse/degree2 --fields-terminated-by 't' -m 1