整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

15.6使用导入的数据

旦数据被导入HDFS就可以供定制的MapReduce程序使用。导入的文 本格式数据可以供Hadoop Streaming中的脚本或以TextlnputFormat为默 认格式运行的MapReduce作业使用。

为了使用导入记录的个别字段,必须对字段分隔符(以及转义/包围字符)进行解析,抽出字段的值并转换为相应的数据类型。例如,在文本文件中, sprocketid被表示成字符串“1”,但必须被解析为JavaIntegerint类型的变量。

Sqoop生成的表类能够自动完成这个过程,使你可以将精力集中在真正要运 行的MacReduce作业上。每个自动生成的类都有几个名为parse()的重载 方法,这些方法可以对表示为TextCharSequencechar[]或其他常见

类型的数据进行操作。

名为MaxWidgetldMapReduce应用(在示例代码中)可以找到具有最大ID 的部件。

这个类可以和奶处一起被编译成一个*JAR文件。在编译时需要将 Hadoop的位置加入类路 径,然后类文件就可以被合并生成一个MR文件,并且像这样运行:

% jar cvvf widgets.jar *.class
% HADOOP_CLASSPATH=/usr/lib/sqoop/sqoop-version, jar hadoop jar \
>widgets.jar MaxWidgetld -libjars /usr/lib/sqoop/sqoop-version.jar

MaxWidgetld.run()方法在运行时,以及map任务在集群上运行时(通 过-Ubjars参数),该命令确保了 Sqoop位于本地的类路径中(通过$HADOOP_ CLASSPATH)。

运行之后,HDFSwaxw/c/g他路径中便有一个名为的文件, 其内容如下:

3jgadget,99.99^1983-08-13,13,Our flagship product

注意,在这个MapReduce示例程序中,一个Widget对象从mapper被发送 到reducer;这个自动生成的Widget类实现了 Hadoop提供的Writable接 口,该接口允许通过Hadoop的序列化机制来发送对象以及写到 SequenceFile文件或从SequenceFile文件读出对象。

这个MaxWidgetID的例子是建立在新的MapReduce API之上的。虽然某些 高级功能(例如使用大对象数据)只有在新的API中使用起来才更方便,但无 论新旧API,都可以用来构建依赖于Sqoop生成代码的MapReduce应用。

前面4.4.7节介绍了用于处理Avro格式导入的API。采用通用的Avm映射 时,MapReduce程序不需要使用针对数据表的模式所生成的代码(尽管使用 Avm的特定编译器时这也是其中一个选项;在这种情况下,Sqoop不会生成代码)。示例代码中包含有一个名为MaxWidgetldGenericAvro的程序,用于找出具有最大ID的部件并将结果写入一个Avro数据文件。

导入的数据与Hive

如第〗2章所述,对于很多类型的分析任务来说,使用类似于Hive的系统 来处理关系操作有利于加快分析任务的开发。特别是对于那些来自于关系 数据源的数据,使用Hive是非常有帮助的。HiveSqoop共同构成了一个 强大的服务于分析任务的工具链。

假设在我们的系统中有另外一组数据记录,来自一个基于Web的零部件采 购系统。这个系统返回的记录文件中包含部件ID、数量、送货地址和订单 曰期。

下面是此类记录的例子:

1.15.120    Any St.,Los Angeles,CA,90210,2010-08-01
3.4.120     Any St.,Los Angeles,CA,90210,2010-08-01 2,5,400 Some PICupertino,CA,95014,2010-07-30 2,7,88 Mile Rd.,Manhattan,NY,10005,2010-07-18

通过使用Hadoop来分析这组采购记录,我们可以深入了解我们的销售业 务。将这些数据与来自关系数据源(widgets表)的数据相结合,可以使我们 做得更好。在这个例子中,我们将计算哪个邮政编码区域的销售业绩最 好,便可以让我们的销售团队更加关注于该区域。为了做到这一点,我们 同时需要来自销售记录和widgets表的数据。

上述销售记录数据被保存在一个名为sa/es./og的本地文件中。

首先,让我们将销售数据载入Hive:

hive> CREATE TABLE sales(widget_id INT, qty INT,
>  street STRING, city STRING, state STRING,
>  zip INT, sale_date STRING)
>  ROW FORMAT DELIMITED FIELDS TERMINATED BY 'J
OK
Time taken: 5.248 seconds
hive> LOAD DATA LOCAL INPATH "sales.log" INTO TABLE sales;
Copying data from file:/home/sales.log Loading data to table sales OK
Time taken: 0.188 seconds

Sqoop能够根据一个关系数据源中的表来生成一个Hive表。既然我们已经


 

widgets表的数据导人到HDFS,那么我们就直接生成相应Hive表的定 义,然后加载保存在HDFS中的数据:

% sqoop create-hive-table --connect jdbc:mysql://localhost/hadoopguide \
>  --table widgets --fields-terminated-by
10/06/23 18:05:34 INFO hive.Hivelmport: OK
10/06/23 18:05:34 INFO hive.Hivelmport: Time taken: 3.22 seconds 10/06/23 18:05:35 INFO hive.Hivelmport: Hive import complete.
% hive
hive〉 LOAD DATA INPATH "widgets" INTO TABLE widgets;
Loading data to table widgets OK
Time taken: 3.265 seconds

在为一个特定的已导人数据集创建相应的Hive表定义时,我们需要指定该 数据集所使用的分隔符。否则,Sqoop将允许Hive使用它自己的默认分隔 符(与SqtK)p的默认分隔符不同)。

Hive的数据类型不如大多数SQL系统的丰富。很多SQL类型在

0* Hive中都没有直接对应的类型。当Sqoop为导入操作生成Hive表定 〇>*义时,它会为数据列选择最合适的Hive类型,这样可能会导致数据 '精度的下降。一旦出现这种情况,Sqoop就会提供一条箬告信息,

如下所示:

10/06/23 18:09:36 WARN hive.TableDefWriter:
Column design_date had to be cast to a less precise type in Hive

如果想直接从数据库将数据导人到Hive,可以将上述的三个步骤(将数据导 入HDFS,创建Hive表,将HDFS中的数据导入Hive)缩短为一个步骤。在 进行导入时,Sqoop可以生成Hive表的定义,然后直接将数据导入Hive 表。如果我们还没有执行过导入操作,就可以使用下面的命令,根据 MySQL中的数据直接创建Hive中的widgets表:

% sqoop import --connect jdbc:mysql://localhost/hadoopguide \
>  --table widgets -m 1 --hive-import

«•

使用–hive-import参数来运行sqoop import工具,可以从源数 据库中直接将数据载入Hive,它自动根据源数据库中表的模式来推 断Hive表的模式。这样,只需要一条命令,你就可以在Hive中来 使用自己的数据。

无论选择哪一种数据导入的方式,现在我们都可以使用widgets数据集和


sales数据集来计算最赚钱的邮政编码地区。让我们来做这件事,并且把 査询的结果保存在另外一张表中,供将来使用:

hive> CREATE TABLE zip_profits (sales_vol DOUBLE^ zip INT);
OK
hive> INSERT OVERWRITE TABLE zip_profits
>   SELECT SUM(w.price * s.qty) AS sales.vol, s.zip FROM SALES s
>   JOIN widgets w ON (s.widget_id = w.id) GROUP BY s.zip;
3 Rows loaded to zip_profits OK
hive> SELECT * FROM zip_profits ORDER BY sales_vol DESC;
OK
403.71 90210
28.0    10005
20.0    95014

转载请注明:全栈大数据 » 15.6使用导入的数据

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址