参考文档: 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-master”项目很可能是包含了一些示例的Java UDF,演示了如何创建、编译和使用Pig UDF。这些示例可能覆盖了上述的三种UDF类型,帮助开发者理解如何将Java代码与Pig的处理流程...
例如,以下是一个简单的Pig Latin脚本示例,用于分析`access_log.txt`中的数据: ``` pig LOGS = LOAD 'access_log.txt' USING PigStorage('\t') AS (timestamp:chararray, ip:chararray, agent:chararray, method:...
这种模式在清单1所示的简单示例中得到了体现,它演示了如何使用Pig Latin查找日志文件中的警告记录。 在Pig Latin中,"LOAD"语句用于从文件系统加载数据,"FILTER"用于根据指定条件筛选数据,"STORE"则将处理后的...
为了帮助开发者更好地理解和使用IHD 2.2,官方发布了一份详尽的开发者指南,旨在提供一系列实用的示例代码和管理指令,让开发者能够快速上手并利用该平台构建高效的数据处理应用。 #### 二、开始前的准备 在正式...
嵌入式八股文面试题库资料知识宝典-华为的面试试题.zip
训练导控系统设计.pdf
嵌入式八股文面试题库资料知识宝典-网络编程.zip
人脸转正GAN模型的高效压缩.pdf
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
少儿编程scratch项目源代码文件案例素材-鸡蛋.zip
嵌入式系统_USB设备枚举与HID通信_CH559单片机USB主机键盘鼠标复合设备控制_基于CH559单片机的USB主机模式设备枚举与键盘鼠标数据收发系统支持复合设备识别与HID
嵌入式八股文面试题库资料知识宝典-linux常见面试题.zip
面向智慧工地的压力机在线数据的预警应用开发.pdf
基于Unity3D的鱼类运动行为可视化研究.pdf
少儿编程scratch项目源代码文件案例素材-霍格沃茨魔法学校.zip
少儿编程scratch项目源代码文件案例素材-金币冲刺.zip
内容概要:本文深入探讨了HarmonyOS编译构建子系统的作用及其技术细节。作为鸿蒙操作系统背后的关键技术之一,编译构建子系统通过GN和Ninja工具实现了高效的源代码到机器代码的转换,确保了系统的稳定性和性能优化。该系统不仅支持多系统版本构建、芯片厂商定制,还具备强大的调试与维护能力。其高效编译速度、灵活性和可扩展性使其在华为设备和其他智能终端中发挥了重要作用。文章还比较了HarmonyOS编译构建子系统与安卓和iOS编译系统的异同,并展望了其未来的发展趋势和技术演进方向。; 适合人群:对操作系统底层技术感兴趣的开发者、工程师和技术爱好者。; 使用场景及目标:①了解HarmonyOS编译构建子系统的基本概念和工作原理;②掌握其在不同设备上的应用和优化策略;③对比HarmonyOS与安卓、iOS编译系统的差异;④探索其未来发展方向和技术演进路径。; 其他说明:本文详细介绍了HarmonyOS编译构建子系统的架构设计、核心功能和实际应用案例,强调了其在万物互联时代的重要性和潜力。阅读时建议重点关注编译构建子系统的独特优势及其对鸿蒙生态系统的深远影响。
嵌入式八股文面试题库资料知识宝典-奇虎360 2015校园招聘C++研发工程师笔试题.zip
嵌入式八股文面试题库资料知识宝典-腾讯2014校园招聘C语言笔试题(附答案).zip
双种群变异策略改进RWCE算法优化换热网络.pdf