工作中经常遇到使用Hive导出数据到文本文件供数据分析时使用。Hive导出复杂数据到csv等文本文件时,有时会遇到以下几个问题:

  1. 导出的数据只有数据没有列名。
  2. 导出的数据比较复杂时,如字符串内包含一些制表符、换行符等。直接导出后,其它程序无法对数据进行正常的分割。若直接使用管道符号和sed指令的话,会导致分列出错。
  3. 数据分析师使用数据时使用R语言,加载数据时如果一个字段只有单引号或双引号时,会导致后续数据读为一行。
  4. 导出数据时空值在文本显示为\N,不是NULL。
  5. hive导出的数据生成若干个000000_0,000001_0这样的文件,可读性比较差,需要手工去合并

针对上述几个问题采取以下解决方案:

  1. 导出的数据不包含列名,使用hive -e 'use mydb;SET hive.cli.print.header=true; SELECT * FROM t_test LIMIT 0'方式获取列名。若抓取的为多张表的字段,需要对查询语句进行相应的调整。
  2. 根据具体的情况设置合适的分隔符,我这里使用一般极少用到的符号 '|' 作为分隔符。
  3. 对于出现的单引号和双引号,在经过分析师沟通后,对这些无实际意义的一个字段只有单引号或双引号的字段置空。若有其它需求也可以根据具体情况进行替换。
  4. 使用sed指令对\N字段进行替换。根据具体情况,注意确保不修改到字符串中的\N。可以把'|\N|'替换为'|NULL|',行首行尾的数据也要考虑到。我这里由于其它字段不包含'\N',就简化处理了。
  5. 000000_0文件聚合使用脚本进行解决。

下面为一个具体的示例的shell脚本:

 #!/bin/bash
mkdir -p /tmp/project_1010/project #初始化结果存放的目录
hive -e "use mydb;
insert overwrite local directory '/tmp/project_1010/t_test/' #指定该表初步查询结果存放的目录
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' #指定字段分隔符
select t.* from t_test t JOIN  #查询语句
t_test1 t1
on t1.test_id = t.test_id;
"
# 生成表头,替换表头前的't_test.'字段,并写入最终的csv文件中
hive -e 'use mydb;SET hive.cli.print.header=true; SELECT * FROM t_test LIMIT 0' | sed -e 's/\t/|/g;s/t_test\.//g' > /tmp/project_1010/project/t_test.csv
cat /tmp/project_1010/t_test/* >> /tmp/project_1010/project/t_test.csv #把000000_0,000001_0这样的文件通过追加的方式,写入最终的csv文件中
sed -i 's/\\N/NULL/g' /tmp/project_1010/project/t_test.csv #使用sed处理最终的csv文件,根据需求进行替换
sed -i "s/|'|/|NULL|/g" /tmp/project_1010/project/t_test.csv
sed -i 's/|"|/|NULL|/g' /tmp/project_1010/project/t_test.csv

本脚本假设抓取项目project中t_test表的数据。考虑到需求的变动,每次生产的项目目录加一个日期后缀,如“project_1010”。一般一个项目会抓取对个表,针对每个表都会创建一个子目录存储生产的000000_0,000001_0等数据。示意图如下:

 project_1010/
├── project #项目名
│ ├── t_test.csv
│ ├── t_test1.csv
├── t_test #抓取的t_test表数据
│ ├── 000000_0
│ └── 000001_0
├── t_test1 #抓取的t_test1数据
│ ├── 000000_0
│ └── 000001_0

先抓取每张需要的表的数据,最后统一汇总在project的目录下,最终的数据就存储在project目录下。

在实际的使用环境中,可以再写shell脚本和一个配置文件(包括项目名、抓取的表的列表、需要执行的查询语句)直接生成上述的脚本,不需要一个个的手动生成。

Hive导出复杂数据到csv文件的更多相关文章

  1. PHP导出数据到CSV文件函数 csv_export()

    后台往往需要导出各种数据到 Excel文档中.通常我们是导出 .csv文件格式,PHP导出函数参考代码如下: /** * 导出数据到CSV文件 * * @param array $data 二维数组( ...

  2. PHP导出数据到CSV文件函数/方法

    如果不清楚什么是CSV文件,可看如下文章介绍  CSV格式的是什么文件?CSV是什么的缩写? /** * 导出数据到CSV文件 * @param array $data 数据 * @param arr ...

  3. PHP导出数据到CSV文件

    后台往往需要导出各种数据到 Excel文档中.通常我们是导出 .csv文件格式,PHP导出函数参考代码如下: /** * 导出数据到CSV文件 * * @param array $data 二维数组( ...

  4. CSV文件数据如何读取、导入、导出到新的CSV文件中以及CSV文件的创建

    CSV文件数据如何读取.导入.导出到新的CSV文件中以及CSV文件的创建 一.csv文件的创建 (1)新建一个文本文档: 打开新建文本文档,进行编辑. 注意:关键字与关键字之间用英文半角逗号隔开.第一 ...

  5. mysql导出数据到csv文件

    在日常工作中经常会遇见导出表中的数据到csv文件的操作,这里就简单总结一下导出的操作. 下面对csv文件的描述是摘录: 据RFC4180文档设置的,该文档全称Common Format and MIM ...

  6. PHP导出MySQL数据到Excel文件

    PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存 ...

  7. php导出百万数据到csv

    <?php set_time_limit(0); // 设置超时 ini_set('memory_limit', '100M'); // 设置最大使用的内存 header("Conte ...

  8. C# 将List中的数据导入csv文件中

    //http://www.cnblogs.com/mingmingruyuedlut/archive/2013/01/20/2849906.html C# 将List中的数据导入csv文件中   将数 ...

  9. python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件

    python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中 ...

随机推荐

  1. 【ASP.NET MVC】View与Controller之间传递数据

    1   概述 本篇文章主要从操作上简要分析Controller<=>View之间相互传值,关于页面之间传值,如果感兴趣,可参考我另外一篇文章ASP.NET 页面之间传值的几种方式 . Co ...

  2. Microsoft Visual Studio 打开代码出现乱码解决方案

    在用VS编写代码时,文本的字符集可能和编译器的字符集不同,在这种情况下代码会显示出乱码. 解决办法: 在VS的工具->选项里面找到"文本编辑器",勾选“自动检测不带签名的UT ...

  3. grunt之watch续

    上一回没有说完,我就是这样,做之前心中波澜壮阔,锦绣山河,等画完小草开始烦躁,完成鲜花出现动摇,然后心神涣散,最后虎头蛇尾. 现在弥补下之前遗漏的问题. watch(V0.6.1)的tasks和opt ...

  4. NET Core度身定制的AOP框架

    NET Core度身定制的AOP框架 多年从事框架设计开发使我有了一种强迫症,那就是见不得一个应用里频繁地出现重复的代码.之前经常Review别人的代码,一看到这样的程序,我就会想如何将这些重复的代码 ...

  5. Java课程设计 购物车系统(个人博客)

    1. 团队课程设计博客链接 课程设计 2. 个人负责模块或任务说明 编写ShoppingCart类,连接数据库 编写updateCart类,从数据库中获取商品信息,获取指定编号的商品信息 编写User ...

  6. POJ 3190 Stall Reservations (优先队列)C++

    Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7646   Accepted: 271 ...

  7. “.Net 社区大会”(dotnetConf) 2017 Day 1 Keynote: .NET Everywhere

    8月份已经发布了.NET Core 2.0, 大会Keynote 一开始花了大量的篇幅回顾.NET Core 2.0的发布,社区的参与度已经非常高.大会的主题是.NET 无处不在: NET Core ...

  8. SpringMVC第一篇【介绍、入门、工作流程、控制器】

    什么是SpringMVC? SpringMVC是Spring家族的一员,Spring是将现在开发中流行的组件进行组合而成的一个框架!它用在基于MVC的表现层开发,类似于struts2框架 为什么要使用 ...

  9. Servlet第四篇【request对象常用方法、应用】

    什么是HttpServletRequest HttpServletRequest**对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,**HTTP请求头中的所有信息都封装在这个对象中,开发人 ...

  10. Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)

    上一篇讲了如何在linux搭建web环境,这边将如何部署项目. 1,打包项目包 2,上传项目包 将.war项目包通过xftp上传到tomcat目录wabapps目录下 3,启动项目 通过xshell命 ...