如何加载多个记录在一行中的固定宽度数据

时间:2016-05-06 18:10:33

标签: hadoop mapreduce hive

我有一个分隔文件,如下面的

donaldtrump   23  hyd  tedcruz      25  hyd  james       27  hyd  

前三组字段应该是一条记录,第二组3条字段是一条记录,依此类推......将此文件加载到下面的hive表中的最佳方法是什么(emp_name,age,location)

1 个答案:

答案 0 :(得分:0)

一种非常非常脏的方法可能是:

  1. 设计一个简单的Perl脚本(或Python脚本或sed命令行),它从 stdin 获取源记录,将它们分成N个逻辑记录,并将它们推送到标准输出
  2. 告诉Hive使用该脚本/命令作为自定义Map步骤,使用TRANSFORM语法 - 手册是there,但它非常神秘,你可以通过Google做一些更好的例子例如thisthatwhatever
  3. 警告:这个"流媒体"模式相当慢,因为必须序列化/反序列化为纯文本。但是,一旦你有一个工作的人,开发成本是最小的。

    补充警告:当然,如果必须按顺序处理源记录 - 因为逻辑记录可能会溢出到下一行,例如 - 那么你有一个大问题,因为Hadoop可以任意拆分源文件并将拆分提供给不同的Mapper。并且您的示例中没有DISTRIBUTE BY子句的条件。然后,一个非常非常非常脏的技巧是使用GZIP压缩源文件,使其事实上不可拆分。