`
zqhxuyuan
  • 浏览: 32260 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

Pig UDF(LOAD)示例代码分析

Pig 
阅读更多

参考文档: Hadoop:The Definitive Guide3E Chapter11.Pig

代码具体地址: tomwhite-hadoop-book-32dae01\ch11\src\main\java\com\hadoopbook\pig

工具类

 

public class Range {
  private final int start;
  private final int end;

  public Range(int start, int end) {
    this.start = start;
    this.end = end;
  }

  public int getStart() {
    return start;
  }

  public int getEnd() {
    return end;
  }
  
  public String getSubstring(String line) { //abcdefghi ==>sample.txt的每一行
	//rangeSpec: 1-2,5-6  ==>CutLoadFunc()的参数值
	//1-2: start=1,end=2, "abcedfghi".substring(0,2)=>ab
	//5-6: start=5,end=6, "abcedfghi".substring(4,6)=>df
    return line.substring(start - 1, end);
  }
  
  @Override
  public int hashCode() {
    return start * 37 + end;
  }

  @Override
  public boolean equals(Object obj) {
    if (!(obj instanceof Range)) {
      return false;
    }
    Range other = (Range) obj;
    return this.start == other.start && this.end == other.end;
  }

  //1-2,5-6
  public static List<Range> parse(String rangeSpec)
      throws IllegalArgumentException {
    if (rangeSpec.length() == 0) {
      return Collections.emptyList();
    }
    List<Range> ranges = new ArrayList<Range>();
    String[] specs = rangeSpec.split(","); //["1-2", "5-6"]
    for (String spec : specs) {
      String[] split = spec.split("-"); //["1", "2"]
      try {
        ranges.add(new Range(Integer.parseInt(split[0]), Integer
            .parseInt(split[1]))); //start=1, end=2
      } catch (NumberFormatException e) {
        throw new IllegalArgumentException(e.getMessage());
      }
    }
    return ranges;
  }

}

 自定义函数

 

public class CutLoadFunc extends LoadFunc {

  private static final Log LOG = LogFactory.getLog(CutLoadFunc.class);

  private final List<Range> ranges; //工具类,解析范围参数,范围针对的是文件里的每一行数据.进行截取操作
  private final TupleFactory tupleFactory = TupleFactory.getInstance();
  private RecordReader reader; //LOAD命令加载文件,reader会去读取文件里的每一行数据

  public CutLoadFunc(String cutPattern) { //构造函数接收参数:范围->'16-19,88-92,93-93'
    ranges = Range.parse(cutPattern);
  }
  
  @Override
  public void setLocation(String location, Job job)
      throws IOException {
    FileInputFormat.setInputPaths(job, location);
  }
  
  @Override
  public InputFormat getInputFormat() {
    return new TextInputFormat();
  }
  
  @Override
  public void prepareToRead(RecordReader reader, PigSplit split) {
    this.reader = reader;
  }

  //读取文件里的每一行记录
  @Override
  public Tuple getNext() throws IOException {
    try {
      if (!reader.nextKeyValue()) {
        return null;
      }
      Text value = (Text) reader.getCurrentValue(); //读取到当前行的数据
      String line = value.toString(); //line为当前行的数据
	  
      Tuple tuple = tupleFactory.newTuple(ranges.size());
      for (int i = 0; i < ranges.size(); i++) {
        Range range = ranges.get(i); //调用构造函数时,通过范围参数,已经将List<Range>的数据填充完毕.即此时每一个Range对象的start.end都是有值的.
        if (range.getEnd() > line.length()) {
          LOG.warn(String.format(
              "Range end (%s) is longer than line length (%s)",
              range.getEnd(), line.length()));
          continue;
        }
        tuple.set(i, new DataByteArray(range.getSubstring(line))); //传入当前行的数据,调用截取方法(start,end已经有值),截取当前行对应的范围的字符串.
      }
      return tuple; //tuple可以看做是一个上下文. 参数就是通过上下文传入的.
    } catch (InterruptedException e) {
      throw new ExecException(e);
    }
  }
}
分享到:
评论

相关推荐

    pig udf 示例

    pig udf 示例

    pig udf 函数(urldecode row_number tomap)

    在大数据处理领域,Apache Pig 是一个非常重要的工具,它提供了一种高级的脚本语言(Pig ...通过理解并正确使用这些自定义 UDF,你可以更灵活地处理各种复杂的数据处理任务,提高 Pig 在大数据分析中的效率和实用性。

    大数据 java hive udf函数的示例代码(手机号码脱敏)

    "大数据 Java Hive UDF 函数示例代码(手机号码脱敏)" 大数据 Java Hive UDF 函数示例代码(手机号码脱敏)是指使用 Java 语言开发的用户定义函数(User Defined Function,UDF),该函数可以在 Hive 中使用,实现...

    UDF.zip_udf_udf代码

    6. **UDF的使用示例**:提供了实际的代码示例,展示了如何在查询语句中调用UDF,以及UDF在实际业务场景中的应用。 7. **安全性与权限管理**:讲解了UDF的安全性问题,包括权限设置,如何限制非授权用户的访问,以及...

    udf提权PHP代码

    udf提权PHP代码

    pig编程指南中的样例脚本、UDF、数据集

    在《Programming Pig》第二版中,读者可以期待更加详尽的示例、更深入的UDF开发指南以及多样化的数据集。这本书不仅适合初学者,也对有经验的Pig用户有所启发,帮助他们提高在大数据环境下的编程技能。通过阅读和...

    1005_udf波_波浪模拟的udf_fluent造波_udf造波_UDF造波

    - **test.c**:这可能是一个C语言编写的UDF示例代码,用于在Fluent中实现特定的波浪生成算法。 - **123.msh**:这通常是网格文件,网格是CFD模拟的基础,用于划分计算域并分配物理属性,如速度、压力等。 - **udf....

    pdi-pig-udfs:使用 Pentaho 数据集成的 Pig UDF 的集合

    这个项目的目标是为 Pentaho Kettle 提供与 Pig 集成的 UDF 支持,从而扩展了 Kettle 在大数据分析场景下的能力。 **Pentaho Data Integration (Kettle) 知识点:** 1. **ETL 工具**:Kettle 是一个图形化的 ETL ...

    pig-udf:猪用UDF样本

    虽然没有提供具体的源代码,但“pig-udf-master”项目很可能是包含了一些示例的Java UDF,演示了如何创建、编译和使用Pig UDF。这些示例可能覆盖了上述的三种UDF类型,帮助开发者理解如何将Java代码与Pig的处理流程...

    multiphase_fluentudf_多相流_多相流udf_udf_多相流udf_

    描述中提到的“关于fluent中多相流模拟的udf的例子”,意味着这个压缩包可能包含了一些具体的UDF代码示例,用于指导用户如何在Fluent中编写和应用UDF进行多相流的模拟。这些示例可能涵盖了初始化多相流模型、定义交...

    用于进行hadoop pig分析的日志

    例如,以下是一个简单的Pig Latin脚本示例,用于分析`access_log.txt`中的数据: ``` pig LOGS = LOAD 'access_log.txt' USING PigStorage('\t') AS (timestamp:chararray, ip:chararray, agent:chararray, method:...

    Fluent的UDF官方案例(含代码)

    教程内容非常丰富,通过示例代码和实际案例,让读者在实践中学习如何使用UDF来解决各种CFD模拟问题,从而提高解决问题的能力和模拟的准确性。对于希望深入学习和掌握ANSYS Fluent高级功能的工程师或研究人员来说,这...

    ex-05_fluentudf_udf_源项udf_udf源项参数化_动量源udf代码_源码

    描述中提到的"fluent修改动量源项UDF案例(fluent文件及UDF源代码)"意味着这个压缩包可能包含一个具体的示例,指导用户如何在Fluent中通过UDF来修改动量源项。动量源项在流体流动问题中至关重要,它可以用来模拟...

    UDF ISO9660 FAT(12,16,32) NTFS文件系统规范以及示例代码

    总的来说,这些文件系统规范和示例代码涵盖了从简单的光盘文件系统(如UDF和ISO9660)到更复杂的磁盘文件系统(如FAT和NTFS)的各种技术。通过研究这些代码,开发者可以深入理解文件系统的工作原理,如何进行读写...

    udf_udf_

    - **实例2.txt**和**实例1.txt**:可能是UDF的示例代码,供学习和参考。 学习和应用UDF需要一定的编程基础和流体力学知识,但其灵活性和扩展性使得它可以解决许多复杂流动问题。结合这些资源,你将能够更深入地理解...

    UDF_udf_udf速度入口_velocity_inlet_源码

    UDF(User Defined Functions)是OpenFOAM等流体动力学软件中的一种用户自定义功能,允许用户根据特定需求编写源...通过分析和调试这些源代码,我们可以更好地理解和控制流体模拟过程,为工程问题提供精确的解决方案。

    fluent UDF手册-工具.zip_fluent_udf_udf 手册_udf手册

    **第六章:UDF的应用示例** 在“第6章.doc”中,可能详细介绍了UDF在实际问题中的应用,例如如何创建一个自定义的湍流模型或者实现特定的源项。这部分内容可能涵盖了以下知识点: 1. **自定义源项**:UDF可用于...

    udf-fluent_fluent_fluentudf_udf_

    "udf-fluent"压缩包文件可能包含了UDF编程的示例代码和教程资源,是学习和研究UDF的好材料。 总的来说,Fluent UDF是流体模拟领域的强大工具,它将C语言的灵活性与Fluent的计算能力相结合,为解决复杂流体问题提供...

    ANSYS Fluent UDF Manual.rar_ANSYS FLUENT UDF_UDF manual_UDF-flu

    手册也会提供一些示例代码,帮助用户更好地理解如何在实践中应用这些技术。 此外,手册还可能包含有关调试和优化UDF的章节,包括如何使用Fluent的内置诊断工具,以及如何通过调整算法和内存管理来提高性能。对于...

    项UDF_磁场udf_磁场力_电磁场_mhd_电磁udf

    "新建文本文档.txt"的名称虽然不明确,但根据上下文推测,可能包含的是UDF的编写指南、示例代码或者关于如何在Fluent中编译和链接UDF的说明。 总的来说,这个压缩包中的文件为Fluent MHD模拟提供了一套完整的UDF...

Global site tag (gtag.js) - Google Analytics