最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

Pig系统分析(2)

来源:懂视网 责编:小采 时间:2020-11-09 15:51:05
文档

Pig系统分析(2)

Pig系统分析(2):Pig哲学之一——Pigs Eat Anything。Pig能够从不同数据源加载数据,能够处理不同式的数据。Pig使用Loader/Store进行数据加载和存储,可选地使用Schema指定数据列名称和类型。如果加载数据时不指定Schema,数据列未命名,类型默认是字节数组(bytearra
推荐度:
导读Pig系统分析(2):Pig哲学之一——Pigs Eat Anything。Pig能够从不同数据源加载数据,能够处理不同式的数据。Pig使用Loader/Store进行数据加载和存储,可选地使用Schema指定数据列名称和类型。如果加载数据时不指定Schema,数据列未命名,类型默认是字节数组(bytearra

Pig哲学之一——Pigs Eat Anything。Pig能够从不同数据源加载数据,能够处理不同式的数据。Pig使用Loader/Store进行数据加载和存储,可选地使用Schema指定数据列名称和类型。如果加载数据时不指定Schema,数据列未命名,类型默认是字节数组(bytearray),在后

Pig哲学之一——Pigs Eat Anything。Pig能够从不同数据源加载数据,能够处理不同格式的数据。Pig使用Loader/Store进行数据加载和存储,可选地使用Schema指定数据列名称和类型。如果加载数据时不指定Schema,数据列未命名,类型默认是字节数组(bytearray),在后续操作中,Pig可以通过位置参数引用数据列,会根据在数据列上进行的操作进行自动类型转化。从性能和可读性考虑,最好在加载数据时指定Schema。

Loader体系

Loader的基类是org.apache.pig.LoadFunc,规定了Loader需要实现的接口,并提供了一些默认实现。下图是Loader的继承体系,针对不同数据源,Pig实现了大量Loader,包括HBaseStorage和ParquestLoader等,能够处理列式存储。默认的Loader是PigStorage。

org.apache.pig.LoadFunc中的三个基本的方法决定了Where/What/How:

public abstractvoidsetLocation(String location, Job job) throws IOException
public abstractInputFormat getInputFormat() throws IOException
public LoadCaster getLoadCaster() throws IOException {
 return new Utf8StorageConverter();
}
  1. 指定加载位置。
  2. 指定数据源类型,使用HDFS的InputFormat处理不同数据源。
  3. 如何处理数据从字节数组到实际类型的转化,默认使用Utf8StorageConverter

PigStore分析

1) 处理压缩格式,通过加载文件后缀加载不同的InputFormat:

@Override
public InputFormat getInputFormat() {
 if(loadLocation.endsWith(".bz2") || loadLocation.endsWith(".bz")) {
 return newBzip2TextInputFormat();
 } else {
 return newPigTextInputFormat();
 }
}
2) 读取数据:读取数据之前先代用prepareToRead方法设置InputFormat对应的RecordReader,通过RecordReader读取每行数据,根据用户指定的分隔符处理每行文本,最终转换成元组。
public void prepareToRead(RecordReader reader,PigSplit split)
@Override
public Tuple getNext() throws IOException

3) Schema处理,在getNext方法中,如果存在Schema,会对元组应用applySchema方法,给元组中的数据项指定名称和类型。

其他重要接口

通过实现其他一些接口,Loader能提供一些附加功能

LoadMetaData

  1. 通过getSchema方法自动加载Schema
  2. 通过getPartitionKeys方法设置数据的分区键,把用户查询条件中的分区键通过setPartitionFilter直接传递给Loader,减少数据加载。参见HCatLoader中实现,注:org.apache.hcatalog.pig.HCatLoader

LoadPushDown

在使用RCFile等基于列格式文件时,如果每次都加载所有列对性能影响较大。如果实现了LoadPushDown接口,优化器会将所需要用到的字段传递给pushProjection方法。

LoadCaster

自定义字节数组到Schema中数据类型的转换,通过一系列方法能够自定义字节数组到到Pig的标量和复杂数据类型的转化。默认实现为Utf8StorageConverter,其中的复杂数据类型格式固定,比如元组格式为(),map格式为[],bag为{}。

Store体系

与org.apache.pig.LoadFunc对应,Pig中也存在org.apache.pig.StoreFunc抽象类。由于不少Loader(比如默认的PigStorage)同样实现了store功能,受Java单继承的限制,Pig提供了StoreFuncInterface接口。

Store的实现与Loader对应,将实际输出操作委托给OutputFormat。值得注意的是,与LoadMetadata对应,Pig也提供了StoreMetadata接口用于处理元数据的存储。.

Schema结构

Schema描述了一个数据集合每一行的列名称和数据类型,其中每一个列信息用FieldSchema表示。FieldSchema通常包括列名称、数据类型,如果列本身是bag的话,FieldSchema还会拥有自己的Schema。


参考价值

  1. 目前Pig针对逻辑执行计划的优化器都是基于规则的,如果要实现基于代价的优化,需要更多关于数据的统计信息,那么加载和存储数据应该是重要入口和出口。在LoadMetadata/StoreMetadata接口中已经存在getStatistics/setStatistics方法,ResourceStatistics包含行数、行大小、列直方图、区分度等统计信息,不过现在在PigStorage中是空实现。
  2. 如果要实现Pig On Spark,Loader体系中需要加入RDD层,演变为Loader-RDD-HDFS三层结构。HDFS存储可以考虑ORCFile等列式存储格式,基于成本的优化可以参考Hive中的实现

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

Pig系统分析(2)

Pig系统分析(2):Pig哲学之一——Pigs Eat Anything。Pig能够从不同数据源加载数据,能够处理不同式的数据。Pig使用Loader/Store进行数据加载和存储,可选地使用Schema指定数据列名称和类型。如果加载数据时不指定Schema,数据列未命名,类型默认是字节数组(bytearra
推荐度:
标签: 系统 分析 哲学
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top