设为首页 收藏本站
查看: 1367|回复: 0

[经验分享] Apache Pig和Solr问题笔记(一)

[复制链接]

尚未签到

发表于 2018-11-1 12:47:01 | 显示全部楼层 |阅读模式
  记录下最近两天散仙在工作中遇到的有关Pig0.12.0和Solr4.10.2一些问题总共有3个如下

  1问题一 如何Pig中使用ASCII和十六进制hexadecimal的分隔符进行加载和切分数据

  注意关于这个问题在Pig中会反应到2个场景中
  第一 在Pig加载load数据时候 。
  第二
在Pig处理split或则正则截取数据的时候。

  先稍微说下为啥使用十六进制的字段分隔符而不是我们常见的空格逗号冒号分号#号等这些字符虽然也可以使用但是如果我们数据中有和这些符号冲突的数据那么在解析时就会发生一些出人意料的Bug所以为了保险起见选用肉眼不可读的十六进制的数据是一个不错的选择当然这也是针对场景来说的看情况决定。

  关于详细的ASCII和十六进制二进制八进制十进制的文档介绍请参考维基百科全书。

  下面继续回到正题本例中我们的数据格式是这样存储的
  Java代码 DSC0000.png

  •   每行一条记录,UTF-8编码

  •   每条记录都包括字段名和字段内容
  •   字段之间用ascii码1分隔

  •   字段名与内容之间用ascii码2分隔
每行一条记录,UTF-8编码  
每条记录都包括字段名和字段内容
  
字段之间用ascii码1分隔
  
字段名与内容之间用ascii码2分隔
  一个在eclipse中的小例子如下
  Java代码

  •   public static void main(String[] args) {
  •   //注意\1和\2在我们的IDE中NotePad++中Linux的终端设备的界面中都会呈现不同的

  •   //显示方式大家可以在维基百科中详细了解下

  •   //数据示例

  •   String s="prod_cate_disp_id019";
  •   //split规则

  •   String ss[]=s.split("\2");

  •   for(String st:ss){

  •   System.out.println(st);
  •   }
  •   }
public static void main(String[] args) {  //注意\1和\2在我们的IDE中NotePad++中Linux的终端设备的界面中都会呈现不同的
  //显示方式大家可以在维基百科中详细了解下
  //数据示例
  String s="prod_cate_disp_id019";
  //split规则
  String ss[]=s.split("\2");
  for(String st:ss){
  System.out.println(st);
  }
  }
  
  关于load函数加载时支持的分隔符类型大家可以参考官网的文档
  下面看在Pig脚本的代码
  Java代码

  •   --Hadoop技术交流群415886155
  •   /*Pig支持的分隔符包括
  •   1,任意字符串
  •   2,任意转义字符
  •   3dec的字符\\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;
--Hadoop技术交流群415886155  
/*Pig支持的分隔符包括
  
1,任意字符串
  
2,任意转义字符
  
3dec的字符\\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
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中也能正常查询到数据。如果你也发生了类似的情况请首先确保你能正确的获取到数据不论是从远程读取的还是解析wordexcel或者txt里面的数据都要首先确定能够正确的把数据解析出来然后如果还是没建成功可根据solr的log或者抛出的异常提示进行修复





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629401-1-1.html 上篇帖子: 基于Solr DIH实现MySQL表数据全量索引和增量索引 下篇帖子: solr 自动补全(智能提示)原理与实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表