RCFILE是FACEBOOK公司使用的一种数据存储结构
通过把相同列的数据存放在一起从而得到一个很高的压缩比
RCFILE集成在HIVE中,在HIVE并没有提供PIG读取数据的结构
但是在PIG的第三方库中有人贡献了读取RCFILE的PIGLOAD接口HiveColumnarLoader
使用方法很简单:
/*先注册jar包,需要用到的有这样3个*/
register /tmp/pig/piggybank.jar
register /tmp/pig/hive-exec-0.8.1.jar
register /tmp/pig/hive-common-0.8.1.jar
rcfile_input = LOAD 'input_dir' USING org.apache.pig.piggybank.storage.HiveColumnarLoader('a string,b int');
注:实际使用中逗号后面不能有空格,否则会报类似下面的异常信息
java.lang.IllegalArgumentException: Error: type expected at the position 7 of but 'b' is found.
接口中提供的参数用于解析RCFILE的文件格式
类型并非是PIG的数据类型,而是HIVE中的类型描述,具体对应关系为:
Hive Type | Pig Type from DataType |
---|---|
string | CHARARRAY |
int | INTEGER |
bigint or long | LONG |
float | float |
double | DOUBLE |
boolean | BOOLEAN |
byte | BYTE |
array | TUPLE |
map | MAP |
需要注意的是HiveColumnarLoader据说是从0.8后提供的,不过我在0.8上没有成功,解析数据时会报错
org.apache.hadoop.mapred.Child: Error running child : java.lang.NoSuchMethodError: org.apache.hadoop.hive.serde2.columnar.ColumnarStruct.getField(ILorg/apache/hadoop/io/Text;)Ljava/lang/Object查了一下说是0.8有BUG在0.9.2上已FIX
使用0.9.2使用通过