Hive过滤脏数据的一些经验
如下文件需要处理,每个文件大概13G,其中字段以空格(32)分隔的7个字段;最麻烦的是中间有脏数据:
-rw-r--r-- 1 hadoop ifengdev 1895843464 May 6 14:56 feedback201503_201.tar.gz -rw-r--r-- 1 hadoop ifengdev 1896885848 May 6 14:59 feedback201503_202.tar.gz -rw-r--r-- 1 hadoop ifengdev 1891790676 May 6 15:00 feedback201503_203.tar.gz -rw-r--r-- 1 hadoop ifengdev 1894197100 May 6 15:01 feedback201503_204.tar.gz -rw-r--r-- 1 hadoop ifengdev 1894074074 May 6 15:02 feedback201503_205.tar.gz -rw-r--r-- 1 hadoop ifengdev 1829224750 May 6 16:13 feedback201504_201.tar.gz -rw-r--r-- 1 hadoop ifengdev 1831709571 May 6 16:14 feedback201504_202.tar.gz -rw-r--r-- 1 hadoop ifengdev 1824710879 May 6 16:30 feedback201504_203.tar.gz -rw-r--r-- 1 hadoop ifengdev 1827164031 May 6 16:31 feedback201504_204.tar.gz -rw-r--r-- 1 hadoop ifengdev 1827911208 May 6 16:31 feedback201504_205.tar.gz
直接Load进Hive报错:
Loading data to table default.tmp_20150506 Failed with exception Wrong file format. Please check the file's format. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
没办法中间格式有问题:
网上说改变存储格式可以避免报错:
CREATE TABLE tmp_20150506( dt string, unknown1 string, unknown2 string, reurl string, uid string, num1 int, num2 int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '32' LINES TERMINATED BY '10' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' 改为: CREATE TABLE tmp_20150506( dt string, unknown1 string, unknown2 string, reurl string, uid string, num1 int, num2 int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '32' LINES TERMINATED BY '10' STORED AS TEXTFILE;
确实不报错了,根据具体需求也算一个方法;
最直接的方法:
zcat feedback201503_201.tar.gz|gawk -F ' ' 'NF==7 {print $1, "\t", $2, "\t", $3, "\t", $4, "\t", $5, F ' ' 'NF==7 {print $1, "\t", $2, "\t", $3, "\t", $4, "\t", $5, "\t", $6, "\t", $7}' >> feedback20150, "\t", $6, "\t", $7}' >> feedback201503_204.log
功能:替换空格为制表符;并且过滤字段不满足要求的脏数据;
接着Load进Hive即可;
上述方法比较直接,但觉得“体力劳动“过多,可能我比较懒,所以相对喜欢下边的方法:
基本思路就是把一行作为一个字段load进Hive,利用Hive本身筛选数据:
CREATE TABLE tmp_20150506_raw( allfilds string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '10' LINES TERMINATED BY '10' STORED AS TEXTFILE;
FIELDS TERMINATED BY '10'
LINES TERMINATED BY '10'
都设置成换行符即可,进入Hive以后使用Hive筛选数据即可。
筛选数据并存入另外一张表中,本例的后续处理过程如下:
from ( from ( select allfilds from tmp_20150506_raw where size(split(allfilds, ' ')) = 7) a select split(allfilds, ' ')[0] as dt, split(allfilds, ' ')[1] as unknown1, split(allfilds, ' ')[2] as unknown2, split(allfilds, ' ')[3] as reurl, split(allfilds, ' ')[4] as uid, split(allfilds, ' ')[5] as num1, split(allfilds, ' ')[6] as num2) b insert overwrite table tmp_20150506 partition(month = '2015-04') select *
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
hadoop 2.6伪分布安装
hadoop 2.6的“伪”分式安装与“全”分式安装相比,大部分操作是相同的,主要区别在于不用配置slaves文件,而且其它xxx-core.xml里的参数很多也可以省略,下面是几个关键的配置: (安装JDK、创建用户、设置SSH免密码 这些准备工作,大家可参考hadoop 2.6全分布安装 一文,以下所有配置文件,均在$HADOOP_HOME/etc/hadoop目录下) 另外,如果之前用 yum install hadoop安装过低版本的hadoop,请先卸载干净(即:yum remove hadoop) 一、修改hadoop-env.sh 主要是设置JAVA_HOME的路径,另外按官网说法还要添加一个HADOOP_PREFIX的导出变量,参考下面的内容: export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.65.x86_64export HADOOP_PREFIX=/home/hadoop/hadoop-2.6.0 二、修改core-site.xml 1 <configuration> 2 <prope...
- 下一篇
转帖-hadoop的JobId TaskId生成规则
在hadoop的任务job中,jobid是标志一个任务的唯一标志,可以用于定位到该job,查询该job相关信息,kill掉该job 。 jobId是如何生成的呢 ? 在一般的服务集群上我们通过JobTracker来管理job,该id既是通过JobTracke的getNewJobId()方法得到,具体代码如下: public synchronized JobID getNewJobId() throws IOException { ensureRunning(); return new JobID(getTrackerIdentifier(), nextJobId++); } 代码二: /** * Get the unique identifier (ie. timestamp) of this job tracker start. * @return a string with a unique identifier */ public String getTrackerIdentifier() { return trackerIdentifier; } trac...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16