hive安装笔记

靡不有初,鲜克有终,路漫漫其修远兮,吾将上下而求索。

1、解压安装包

先把安装包下载。然后解压:(解压到路径/usr/local下)

tar -xzvf apache-hive-1.2.1-bin.tar.gz

2、配置环境变量

  1. 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 使环境变量生效

3、配置hive参数

  1. 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. 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

  3. 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中)

  4. 6)启动hive需要开启mysql的远程登录

  5. use mysql; 
    
    update user set host = '%' where user = 'root'; 
    select host, user from user;
    flush privileges;
  6. 4、启动Hadoop集群

  7. start-all.sh

  8. 5、启动hive

  9. 直接在输入hive

  10. 6、向hive中导入数据

  11. 建表语句如下:

    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;

  12. 7、创建成绩表,创建成绩分区表

  13. 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:

  14. ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    修改名为 "student" 的表中的 "course" 列的数据类型为 VARCHAR(50)

  15. ALTER TABLE student MODIFY COLUMN course VARCHAR(50);
    

    修改列的字符集

  16. ALTER TABLE student MODIFY COLUMN course VARCHAR(50) CHARACTER SET utf8;

  17. 加载数据到成绩表:

    load data inpath '/data/score.txt' into table score;

    加载数据到分区成绩表:(通过load加载数据到分区表,hive不会自动分区

  18. load data inpath '/data/score.txt' into table part_score partition(ds='math');

hive安装笔记_第1张图片 

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_scoreds 分区中,其中分区值为 'math'

具体解释如下:

  • insert into part_score partition(ds='math') 表示将数据插入到 part_score 表的 ds 分区,分区值为 'math'
  • select * from score where course='math' 表示从表 score 中选择所有满足条件 course='math' 的数据。
  • 整个语句的作用是将表 score 中满足条件的数据插入到表 part_scoreds='math' 分区中。

hive安装笔记_第2张图片

 

使用hdfs的cat命令查看到的数据也是只有math的数据:

hive安装笔记_第3张图片

 

查看分区情况:

hive安装笔记_第4张图片

 8、创建带桶的表

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 中选择所有的数据。

9、动态分区

设置动态分区:

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 中选择需要插入的数据。在这个例子中,选择了 coursenamescore 列,并将 course 列作为 ds 分区的值。

10.order.by

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博客

hive安装笔记_第5张图片

空白处表示的是创建的数据库使用的编码,我们要先设置这两项,然后再创建数据库。

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

你可能感兴趣的:(hive,笔记,hadoop)