欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大数据平台数据加工流程

程序员文章站 2022-07-06 10:50:49
...

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