大数据实验3.4

1.Sqoop概述

Sqoop是一款开源的工具,主要用于在Hadoop生态系统(Hadoop、Hive等)与传统的数据库(MySQL、Oracle等)间进行数据的传递,可以将一个关系型数据库中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中。

Sqoop导入原理:

在导入开始之前,Sqoop使用JDBC来检查将要导入的表。他检索出表中所有的列以及列的SQL数据类型。这些SQL类型(varchar、integer)被映射到Java数据类型(String、Integer等),在MapReduce应用中将使用这些对应的Java类型来保存字段的值。Sqoop的代码生成器使用这些信息来创建对应表的类,用于保存从表中抽取的记录。Sqoop启动的MapReduce作业用到一个InputFormat,他可以通过JDBC从一个数据库表中读取部分内容。

Hadoop提供的DataDriverDB InputFormat能为查询结果进行划分传给指定个数的map任务。为了获取更好的导入性能,查询会根据一个“划分列”来进行划分。Sqoop会选择一个合适的列作为划分列(通常是表的主键)。在生成反序列化代码和配置InputFormat之后,Sqoop将作业发送到MapReduce集群。Map任务将执行查询并将ResultSet中的数据反序列化到生成类的实例,这些数据要么直接保存在SequenceFile文件中,要么在写到HDFS之前被转换成分割的文本。Sqoop不需要每次都导入整张表,用户也可以在查询中加入到where子句,以此来限定需要导入的记录。

Sqoop导出原理:

Sqoop导出功能的架构与其导入功能非常相似,在执行导出操作之前,Sqoop会根据数据库连接字符串来选择一个导出方法。一般为JDBC。然后,Sqoop会根据目标表的定义生成一个Java类。这个生成的类能够从文本文件中解析记录,并能够向表中插入合适类型的值。接着会启动一个MapReduce作业,从HDFS中读取源数据文件,使用生成的类解析记录,并且执行选定的导出方法。

2.准备环境

1.首先切换到/data目录下,创建名为edu4的目录

view plain "copy

  1. cd /data  

view plain "copy

  1. mkdir /data/edu4  

再切换目录到/data/edu4目录下,下载实验所需的文件。

view plain "copy

  1. cd /data/edu4  

view plain "copy

  1. wget http://59.64.78.41:60000/allfiles/edu4/pinglun  

view plain "copy

  1. wget http://59.64.78.41:60000/allfiles/edu4/creationtime_out  

view plain "copy

  1. wget http://59.64.78.41:60000/allfiles/edu4/userlevelname_out  

2.输入jps,查看hadoop是否已经启动

view plain "copy

  1. jps  

若未启动,则执行启动Hadoop命令

view plain "copy

  1. cd /apps/hadoop/sbin  

view plain "copy

  1. ./start-all.sh  

启动MySQL服务(数据库密码为:zhangyu)

view plain "copy

  1. sudo service mysql start  

查看MySQL服务是否已经启动

view plain "copy

  1. sudo service mysql status  

3.启动Hive

view plain "copy

  1. hive  

Hive中创建数据库名为edu4,并切换到edu4下

view plain "copy

  1. create database edu4;  
  2. use edu4;  

Hive中创建pinglun表,

view plain "copy

  1. create table pinglun (  
  2. productid       string,  
  3. commentcount    int,  
  4. goodcount       int,  
  5. generalcount    int,  
  6. poorcount       int,  
  7. goodrateshow    float,  
  8. generalrateshow float,  
  9. poorrateshow    float,  
  10. guid            string,  
  11. content         string,  
  12. creationtime    string,  
  13. score           int,  
  14. nickname        string,  
  15. userlevelname   string,  
  16. userclientshow  string,  
  17. ismobile        string,  
  18. days            int  
  19. )  row format delimited  
  20. fields terminated by '\t';  

/data/edu4/pinglun评论数据导入到Hive的pinglun表中

view plain "copy

  1. load data local inpath '/data/edu4/pinglun' into table pinglun;  

3.需求一,将Hive表中数据,导入到MySQL

统计pinglun中,用户使用各设备类型数量,并将结果导到mysql中。

1.首先在Hive中,创建一张表,命名为ismobilehive,用于存储统计结果。

view plain "copy

  1. create table ismobilehive(  
  2. ismobile string,  
  3. num int  
  4. )  
  5. row format delimited  
  6. fields terminated by '\t'  
  7. stored as textfile;  

ismobilehive表,有两个字段:设备类型及设备数量

2.在Hive中,统计设备类型数量,并将结果临时存储在hive中的ismobilehive表中。

view plain "copy

  1. insert into table ismobilehive  
  2. select  
  3. case  
  4. when ismobile='true' then 1  
  5. when ismobile='false' then 0  
  6. end as ismobile,  
  7. count(1) as num  
  8. from pinglun  
  9. group by ismobile;  

查看ismobile表。

view plain "copy

  1. select * from ismobilehive;  

3.新打开一个命令行终端,连接Mysql(密码:strongs)

view plain "copy

  1. mysql -u root -p  

mysql中,创建名为edu4out的数据库,用于存储导过来的数据

view plain "copy

  1. CREATE DATABASE IF NOT EXISTS edu4out DEFAULT CHARSET utf8 COLLATE utf8_general_ci;  
  2. use edu4out  

Mysql中创建名为ismobilesql的表,用于储蓄Hive中ismobilehive表的数据。此表也包含两个字段设备类型及设备数量

view plain "copy

  1. create table ismobilesql (ismobile varchar(10),num int);  

4.再新开启一个终端模拟器,使用Sqoop命令将Hive中的ismobilehive表导入到Mysql的ismobilesql中。

view plain "copy

  1. sqoop export \  
  2. --connect jdbc:mysql://localhost:3306/edu4out?characterEncoding=UTF-8 \  
  3. --username root \  
  4. --password strongs \  
  5. --table ismobilesql \  
  6. --export-dir /user/hive/warehouse/edu4.db/ismobilehive/000000_0 \  
  7. --input-fields-terminated-by '\t'  

查看mysql中ismobilesql表,数据内容

view plain "copy

  1. select * from ismobilesql;  

这样,我们就将Hive中的ismobilehive表数据成功导入到Mysql中了。

5.在执行导数据之前,可以进行一个测试,验证Sqoop是否可用

查看Mysql中的数据库。通过此步验证,可以测试出Sqoop以及Mysql是否可以正常连接

view plain "copy

  1. sqoop list-databases \  
  2. --connect jdbc:mysql://localhost:3306/ \  
  3. --username root \  
  4. --password strongs  

结果列出了Mysql中的所有数据库,证明Sqoop可以与Mysql正常连接。

4.需求二,将Hive表中数据,导入到MySQL

hive中多久进行评论数据统计结果导入到Mysql中的dayssql表中

1.在Hive中,创建用户评论周期分析结果表dayshive,包含两个字段多久评论及数量

view plain "copy

  1. create table dayshive(  
  2. day int,  
  3. num int  
  4. )  
  5. row format delimited  
  6. fields terminated by '\t'  
  7. stored as textfile;  

2.对用户评论间隔时间进行统计,并将统计结果导入到Hive中的dayshive表中。

view plain "copy

  1. insert into table dayshive  
  2. select days, count(1) as num from pinglun group by days order by num desc;  

查看Hive表dayshive中的数据

view plain "copy

  1. select * from dayshive;  

3.在Mysql端口创建dayssql表,用于存储dayshive中的数据。dayssql中同样包含两个字段间隔时间及数量

view plain "copy

  1. create table dayssql(day int,num int);  

4.使用Sqoop命令将Hive的dayshive表导入到Mysql的dayssql里。

view plain "copy

  1. sqoop export \  
  2. --connect jdbc:mysql://localhost:3306/edu4out?characterEncoding=UTF-8 \  
  3. --username root \  
  4. --password strongs \  
  5. --table dayssql \  
  6. --export-dir /user/hive/warehouse/edu4.db/dayshive/000000_0 \  
  7. --input-fields-terminated-by '\t'  

查看mysql中dayssql表。

view plain "copy

  1. select * from dayssql;  

5.需求三,将HDFS数据导入到MySQL

HDFS存储有用户级别统计结果数据文件userlevelname_out导入到MySQL中userlevelnamesql表中

1.在HDFS上创建目录/myedu4/in,并将/data/edu4下的creationtime_out和userlevelname_out文件上传到HDFS中的in目录下。

view plain "copy

  1. hadoop fs -mkdir -p /myedu4/in  
  2. hadoop fs -put /data/edu4/creationtime_out /myedu4/in  
  3. hadoop fs -put /data/edu4/userlevelname_out /myedu4/in  

2.在MySQL中,创建表userlevelnamesql。表中包含两个字段用户等级名及数量

view plain "copy

  1. create table userlevelnamesql(userlevelname varchar(10),num int);  

3.使用Sqoop命令将HDFS中/myedu4/in/userlevelname_out表导入到MySQL的userlevelnamesql中。

view plain "copy

  1. sqoop export \  
  2. --connect jdbc:mysql://localhost:3306/edu4out?characterEncoding=UTF-8 \  
  3. --username root \  
  4. --password strongs \  
  5. --table userlevelnamesql \  
  6. --export-dir /myedu4/in/userlevelname_out \  
  7. --input-fields-terminated-by '\t'  

查看userlevelnamesql中的数据

view plain "copy

  1. select * from userlevelnamesql;  

6.需求四,将HDFS中数据导出到MySQL中

HDFS中的存储有评论日期数据统计结果文件creationtime_out导入到MySQL中creationtimesql表中

27.在MySQL端创建creationtimesql表,包含两个字段(creationtime date,num int)

view plain "copy

  1. create table creationtimesql(creationtime date,num int);  

28.使用Sqoop命令将HDFS中的creationtime_out表导入到Mysql中。

view plain "copy

  1. sqoop export \  
  2. --connect jdbc:mysql://localhost:3306/edu4out?characterEncoding=UTF-8 \  
  3. --username root \  
  4. --password strongs \  
  5. --table creationtimesql \  
  6. --export-dir /myedu4/in/creationtime_out \  
  7. --input-fields-terminated-by '\t'  

Mysql中,查看creationtimesql表。

view plain "copy

  1. select * from creationtimesql;  

这样,我们就将四项需求的分析结果导入到MySQL中了!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值