Apache Pig和Solr问题笔记(一)
记录下最近两天散仙在工做中遇到的有关Pig0.12.0和Solr4.10.2一些问题,总共有3个,以下: (1)问题一: 如何Pig中使用ASCII和十六进制(hexadecimal)的分隔符进行加载,和切分数据? 注意关于这个问题,在Pig中,会反应到2个场景中, 第一: 在Pig加载(load)数据时候 。 第二: 在Pig处理split,或则正则截取数据的时候。 先稍微说下,为啥使用十六进制的字段分隔符,而不是咱们常见的空格,逗号,冒号,分号,#号,等,这些字符,虽然也可使用,可是若是咱们数据中有和这些符号冲突的数据,那么在解析时,就会发生一些出人意料的Bug,因此,为了保险起见,选用肉眼不可读的十六进制的数据,是一个不错的选择,固然这也是,针对场景来讲的,看状况决定。 关于详细的ASCII和十六进制,二进制,八进制,十进制的文档介绍,请参考维基 百科全书。 下面继续回到正题,本例中,咱们的数据格式是这样存储的:
Java代码
每行一条记录,UTF-8 编码;
每条记录都包括字段名和字段内容;
字段之间用ascii码1 分隔;
字段名与内容之间用ascii码2 分隔;
一个在eclipse中的小例子以下:
Java代码
public static void main(String[] args) {
//注意\1和\2,在咱们的IDE中,NotePad++中,Linux的终端设备的界面中,都会呈现不一样的
//显示方式,你们能够在维基百科中,详细了解下
//数据示例
String s="prod_cate_disp_id 019" ;
//split规则
String ss[]=s.split("\2" );
for (String st:ss){
System.out.println(st);
}
}
关于load函数,加载时支持的分隔符类型,你们能够参考官网的文档 下面看在Pig脚本的代码:
Java代码
--Hadoop技术交流群:415886155
/*Pig支持的分隔符包括:
1,任意字符串,
2,任意转义字符
3,dec的字符\\u001 或者 \\u002
4,十六进行字符 \\x0A \\x0B
*/
--注意这个load时的分隔符,表明ASCII的1 ,做为Pig里面的dec直接解析方式
a = load '/tmp/dongliang/20150401/20150301/tmp_search_keywords_cate_stat/' using PigStorage('\\u001' ) ;
/**
注意下面的分割符^B,这个符号是脱元字符,只会在终端设备上
显示,这个符号,表明ASCII的2
*/
a = foreach a generate REGEX_EXTRACT ($0 , '(.*)^B(.*)' , 2 ) as time ,
REGEX_EXTRACT ($1 , '(.*)^B(.*)' , 2 ) as kw ,
REGEX_EXTRACT ($2 , '(.*)^B(.*)' , 2 ) as ic ,
REGEX_EXTRACT ($3 , '(.*)^B(.*)' , 2 ) as cid,
REGEX_EXTRACT ($4 , '(.*)^B(.*)' , 2 ) as cname,
REGEX_EXTRACT ($5 , '(.*)^B(.*)' , 2 ) as pname,
REGEX_EXTRACT ($6 , '(.*)^B(.*)' , 2 ) as snt,
REGEX_EXTRACT ($7 , '(.*)^B(.*)' , 2 ) as cnt,
REGEX_EXTRACT ($8 , '(.*)^B(.*)' , 2 ) as fnt,
REGEX_EXTRACT ($9 , '(.*)^B(.*)' , 2 ) as ant,
REGEX_EXTRACT ($10 , '(.*)^B(.*)' , 2 ) as pnt ;
--获取字符串长度
a = foreach a generate SIZE(cid) as len;
--按长度分组
b = group a by len;
--统计各个长度下的数量
c = foreach b generate group, COUNT($1 );
--输出打印
dump c;
(2)问题二:如何在Apache Solr中,查询某个不分词的field的长度,有多少个记录? Solr里面并无直接提供这样相似JAVA里的lenth这样的函数,或者Pig里面的SIZE这样的函数,那么咱们应该如何查询呢? Solr虽然不直接支持这样的查询,可是咱们能够经过正则查询,来变相的实现这个目的,用法以下: (1)查询固定长度 cid:/.{6}/ 只过滤长度为6的记录 (2)查询范围长度 cid:/.{6,9}/ 只过滤长度6到9的记录 (3)查询最少多少长度以上的cid:/.{6}.*/ 长度最少为6的 (3)问题三:在使用Pig+MapReduce,向Solr中,批量添加索引时,发现,无任何错误异常,可是索引里却没任何数据? 这是一个比较诡异的问题,原本,散仙以为应该是程序出问题了,可是后来发现,一样的代码向另一个collection里添加数据,就很正常,查看solr的log,发现里面打印的一些信息以下:
Java代码
INFO - 2015 -04 -01 21 :08 :36.097 ; org.apache.solr.update.DirectUpdateHandler2; start commit{,optimize=false ,openSearcher=true ,waitSearcher=true ,expungeDeletes=false ,softCommit=false ,prepareCommit=false }
INFO - 2015 -04 -01 21 :08 :36.098 ; org.apache.solr.update.DirectUpdateHandler2; No uncommitted changes. Skipping IW.commit.
INFO - 2015 -04 -01 21 :08 :36.101 ; org.apache.solr.core.SolrCore; SolrIndexSearcher has not changed - not re-opening: org.apache.solr.search.SolrIndexSearcher
INFO - 2015 -04 -01 21 :08 :36.102 ; org.apache.solr.update.DirectUpdateHandler2; end_commit_flush
解释下上面的信息的意思,大概就是说在数据索引完了,可是没有发现有commit的数据,因此跳过commit,这一点在程序跑的时候是很是奇怪的,由于数据源HDFS里最少有110万的数据,怎么会没有数据呢? 而后散仙经过谷歌搜索发现也有人发现相似的奇怪状况,无任何异常的状况下,重建索引成功,却在索引里没有看见任何数据,并且最为疑惑的是,这几个网上已经有的案例,居然没有一个有解决方案。 没办法了,只好再次查看程序,这一次散仙,把中间处理好须要建索引的数据,给打印出来看一下,到底什么状况,结果打印出来的都是一行行空数据,原来在使用正则截取数据时,原来的分隔符失效了,因此致使截取不到数据,这下问题基本定位了,solr索引里没有数据,确定是由于原本就没有数据提交,致使的那个奇怪的log发生,结果在散仙把这个bug修复以后,再次重建索引,发现此次果真成功了,在Solr中,也能正常查询到数据。若是你也发生了相似的状况,请首先确保你能正确的获取到数据,不管是从远程读取的,仍是解析word,excel,或者txt里面的数据,都要首先肯定,可以正确的把数据解析出来,而后,若是仍是没建成功,可根据solr的log或者抛出的异常提示,进行修复 。
欢迎关注本站公众号,获取更多信息