大数据平台数据加工流程
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 [email protected]: /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;
转载于:https://my.oschina.net/pearma/blog/821123
上一篇: 【shell】串行执行批量任务脚本
下一篇: 大数据(HBase)-JavaAPI简介