大数据平台数据加工流程

原创
2017/01/09 09:44
阅读数 2K

hadoop平台的底层是hdfs文件系统,所有的数据,都是以文件的方式存放在这个文件系统里的。因此上面的工具,都是以直接读取文件为其基本功能。且不管效率如何,任何文本文件放到平台上,都是可以被解析和查询的。但是要进一步提升查询的效率,对文件格式进行转化,变成列式存储是更好的选择。下面使用hive和impala,演示一下如何装载文本数据到hadoop系统,并能通过hive和impala检索。

基于hive的方案

Step 1. 准备数据文件。假设已有数据文件test.dat,纯文本,字段用^隔开。

>cat /home/hadoop/test.dat
victor^15
julia^20

Step 1.5. 数据压缩

7z a data.zip test.dat -tzip -v200k   #对数据文件进行分卷压缩,如果需要切割的话
7z a data.tar test.dat -ttar -v200k   #对数据文件进行分卷切割

7z x data.zip.001 -tzip.split         #对数据文件进行分卷合并解压
7z x data.tar.001 -ttar.split         #对数据文件进行分卷合并

Step 2.创建hive的文本数据表,用于装载数据

>beeline
beeline> !connect jdbc:hive2://hd-master:10000 hadoop hadoop
beeline>use default;
beeline>create table tbl_txt(uname string , uage int) row format delimited fields terminated by '^' stored as textfile;


Step 3.创建hive的parquet列式存储格式表,并装载数据

beeline>create table tbl_parquet(uname string ,uage int) stored as parquet;
beeline>load data local inpath '/home/hadoop/test.dat' into table tbl_txt;
beeline>insert into tbl_parquet select from tbl_txt;

load数据的时候,要确保hive用户,对数据文件以及数据文件所在目录有读权限。如果权限不足,会提示找不到数据文件,非常具有迷惑性。

基于impala的方案

  • 方案一:为减少数据转换的时间,采用external table的方式,来直接使用外部的数据。

Step 1. 源系统数据流转到大数据平台缓冲区,采用SCP方式上传

scp test.dat root@192.168.1.1: /home/hadoop/

Step 2. 数据由缓冲区移动到hdfs, 采用hdfs copyFromLocal方式

hadoop fs -copyFromLocal /home/hadoop/test.dat hdfs://192.168.1.1/user/hdfs/

Step 3. 在impala里,采用external table方式,直接访问数据。

CREATE DATABASE IF NOT EXISTS mac COMMENT 'customer information';

CREATE EXTERNAL TABLE IF NOT EXISTS tbl_txt_imp
(
    uname STRING COMMENT 'Customer Name', 
    uage    INT COMMENT 'Customer Age',
) 
COMMENT 'External Table' 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '^' 
LOCATION '/user/hdfs/';

此时就完成了建表工作。数据也能够通过select直接访问了。记住location这个部分,写到目录名就可以了。这个目录下的所有文件,如果结构相同,都会合并到一张表里去。

  • 方案二:为提高查询效率,数据需要转成parquet结构。

在方案一基础上,完成以下步骤:

Step 4. 文件格式转换,由csv格式转换成Parquet Table 的格式

# 在impala里完成数据转换的工作;
# 首先建表,parquet格式
[local:21000] > create table tbl_parquet_imp(uname string,uage int) stored as parquet;

# 将hive里装载的表转存到parquet格式表中。
[local:21000] >insert overwrite table tbl_parquet_imp select * from tbl_txt_imp;

空间占用情况对比

改为列式存储后,数据占用的空间,直接减少了一半。

> hadoop fs -ls /user/hive/warehouse/gc_jnl_parquet
Found 1 items
-rwxrwxr-x   3 hadoop supergroup   44140870 2017-02-07 18:17 /user/hive/warehouse/gc_jnl_parquet/000000_0
> hadoop fs -ls /user/hive/warehouse/gc_jnl_txt
Found 1 items
-rwxrwxr-x   3 hadoop supergroup   82999914 2017-02-07 18:09 /user/hive/warehouse/gc_jnl_txt/test.unl

数据类型转换中,binary double是oracle搞出来的基于IEEE-754的实现,转换到hive时,直接使用double作为转换标的即可。

如果要做日期转换,可以用unix_timestamp来转换。例如:

select unix_timestamp ( '2015-05-15 12:00:00-07:00',  'yyyy-MM-dd HH:mm:ss-hh:mm') as may_15_year_month_day;

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部