34 thoughts on “[原创]Apache Pig的一些基础概念及用法总结(1)

  • 2014 年 09 月 03 日 at 08:14
    Permalink

    非常感谢你的分享,写得很好,已向朋友们推荐

    Reply
  • 2014 年 01 月 02 日 at 15:53
    Permalink

    非常受教,感谢楼主的分享

    Reply
  • 2013 年 12 月 30 日 at 15:18
    Permalink

    您好
    pig怎么处理SequenceFile。

    Reply
  • 2013 年 09 月 11 日 at 14:47
    Permalink

    好东东,多谢分享,收藏学习。
    补充一点,如果需要多个输入参数,用多个-param即可,测试通过。

    Reply
  • 2013 年 07 月 29 日 at 17:48
    Permalink

    写得非常明白,例子很详细。
    谢谢。

    Reply
  • 2013 年 06 月 25 日 at 17:17
    Permalink

    date类型的filter没找到详细的哎 楼主能详细点说下么

    Reply
  • 2013 年 06 月 05 日 at 16:54
    Permalink

    LZ, 非常感谢回答呀,我不家一个非常奇怪的问题
    首先category_id是一个string, 证据如下:
    caSchema.add(new Schema.FieldSchema("category_id", DataType.CHARARRAY));

    Describe poi2;
    poi2: {vendorPoiId: chararray,vendorName: chararray,poi_name: chararray,category: chararray}

    dump poi2,列出几条
    (7987421,ypc,Dollar Tree,517)
    (7987422,ypc,Snappps Pit Barbque,227)
    (7987422,ypc,Snappps Pit Barbque,232)
    (8152437,ypc,Smokestack Production Inc,)
    (8152438,ypc,931 Massachusetts Ave Assoc,)
    (8318697,ypc,Houck's Wrecker Svc,71)

    但是我在IsEmpty(category)的时候,报错 ERROR 2102: Cannot test a int for emptiness.

    以及 category_group = group poi2 by category;
    也报错,ClassCastException: java.lang.Integer cannot be cast to java.lang.String

    怎么pig 把category当成Integer呢??????

    Reply
    • 2013 年 06 月 07 日 at 10:39
      Permalink

      (1)IsEmpty的官方解释:
      Checks if a bag or map is empty.
      所以,你不能把IsEmpty用在category上,它既不是bag也不是map。
      (2)经Pig 0.8试验,你所说的第二个错误并不存在。
      用你给的数据:
      [root@localhost ~]$ cat a.txt
      7987421 ypc Dollar Tree 517
      7987422 ypc Snappps Pit Barbque 227
      7987422 ypc Snappps Pit Barbque 232
      8152437 ypc Smokestack Production Inc
      8152438 ypc 931 Massachusetts Ave Assoc
      8318697 ypc Houck' Wrecker Svc 71
      来运行如下Pig脚本毫无问题:
      poi2 = LOAD 'a.txt' AS (vendorPoiId: chararray,vendorName: chararray,poi_name: chararray,category: chararray);
      category_group = GROUP poi2 BY category;
      DUMP category_group;

      输出:
      (227,{(7987422,ypc,Snappps Pit Barbque,227)})
      (232,{(7987422,ypc,Snappps Pit Barbque,232)})
      (517,{(7987421,ypc,Dollar Tree,517)})
      (,{(8152437,ypc,Smokestack Production Inc,),(8152438,ypc,931 Massachusetts Ave Assoc,),(8318697,ypc,Houck' Wrecker Svc 71,)})

      所以,一定是你哪里弄错了。

      Reply
  • 2013 年 06 月 03 日 at 14:38
    Permalink

    LZ ,请教一个问题。

    怎么把
    (1,2,3) 变成
    1
    2
    3
    ???

    Reply
    • 2013 年 06 月 05 日 at 10:52
      Permalink

      你的意思是不是:
      把一个tuple变成一个bag,然后再FLATTEN?

      Reply
      • 2013 年 06 月 05 日 at 16:44
        Permalink

        是的,不过我也刚好在网上找到答案了。
        flatten(TOBAG(*))

        Reply
  • 2013 年 01 月 28 日 at 18:57
    Permalink

    程序如下:
    register LzoPigStorage.jar
    A = load 'data.txt' using PigStorage(';');
    store A into 'data222' using com.twitter.elephantbird.pig.store.LzoPigStorage();
    出现错误如下:
    ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2998: Unhandled internal error. com/twitter/elephantbird/mapreduce/input/LzoTextInputFormat

    请问我该如何解决?求指导

    Reply
    • 2013 年 01 月 29 日 at 12:51
      Permalink

      我建议你先从elephant-bird学起吧,这个问题我一眼看不出是什么原因,深究起来估计也不是几个回复就可以搞定的,等你在Hadoop环境中(包括Pig)配置好了LZO,可以用Java程序通过elephant-bird读取LZO压缩的数据了,问题就解决得差不多了,想靠问我来解决所有这些问题是不现实的。至少我所在的team当时解决各种各样的问题都是用Google以及自己试验解决的,整个架构整合起来花的时间不算少的。我只能建议你多Google了

      Reply
    • 2014 年 03 月 05 日 at 14:48
      Permalink

      同求啊 ~ 不知道怎么解决这个错误!!! 我是parquet文件,可是把jar包弄进去也不行 !! 请问楼上解决这个问题了蛮?

      Reply
  • 2012 年 11 月 07 日 at 14:50
    Permalink

    hbase-0.90.4-cdh3u3;hadoop-0.20.2-cdh3u3;zookeeper-3.3.4-cdh3u3;pig-0.10.0;hive-0.8.0-bin
    这是我的配置,怎么Pig不能操作HBase数据,提示错误为:ERROR org.apache.hadoop.hbase.mapreduce.TableOutputFormat - org.apache.hadoop.hbase.NotServingRegionException: org.apache.hadoop.hbase.NotServingRegionException: Region is not online: -ROOT-,,0

    该怎样解决???

    Reply
    • 2012 年 11 月 07 日 at 17:50
      Permalink

      很遗憾地要再陈述一遍:我没有实践过,无法给你答案,请Google错误信息寻求解决方案。

      Reply
  • 2012 年 11 月 07 日 at 09:31
    Permalink

    请问,能不能把Pig操作HBase数据那部分说的再详细点,包括应该怎么配置。

    Reply
    • 2012 年 11 月 07 日 at 10:05
      Permalink

      正如文中所言,我使用的HBase版本较低,Pig不支持,因此,我没能继续下去。

      Reply
  • 2012 年 03 月 22 日 at 15:21
    Permalink

    to tewilove:
    问题1:还是那个回答,我没有load过HBase的数据,所以无法回答你。

    问题2:我的方法比较笨,两步走——如果你的每一行都是“((a,1),(b,1),(c,3))”这样的字符串(最前端包含两个左括号,最右端包含两个右括号),那么,我是先把每一行拆成N行类似于“c,3”这样的字符串,最后得到类似于这样的N行:
    a,1
    b,2
    a,1
    b,1
    c,3
    c,2
    STORE到磁盘上之后,再用写第二个Pig脚本来统计。由于被拆成了N行最简单的形式,所以统计起来就非常容易了。
    拆成N行我是用了正则替换的方法:
    A = LOAD 'data.txt' AS (col: chararray);
    A1 = FOREACH A GENERATE REPLACE(col, '\\ (\\ (', '\\ (') AS col;
    A2 = FOREACH A1 GENERATE REPLACE(col, '\\ )\\ )', '\\ )') AS col;

    B = FOREACH A2 GENERATE REPLACE(col, '\\ ),\\ (', '\\ )\n\\ (') AS col;
    C = FOREACH B GENERATE REPLACE(col, '\\ (', '') AS col;
    D = FOREACH C GENERATE REPLACE(col, '\\ )', '') AS col;
    STORE D INTO '/home/abc/temp';

    第二个job:
    A = LOAD '/home/abc/temp' AS (col1: chararray, col2: int) USING PigStorage(',');
    B = GROUP A BY col1;
    C = FOREACH B GENERATE FLATTEN(group), COUNT(A);
    DUMP C;

    注:上面的代码中,我特意把斜杠 \ 和括号 “(” 或 “)” 之间加了一个空格,这是因为本站有LaTex语法解析器,当斜杠和括号连在一起的时候,会解释为LaTex语法,从而使后面的代码乱码。所以,请自行把上面的那些空格去掉。

    Reply
    • 2012 年 03 月 22 日 at 18:41
      Permalink

      谢谢,我试试看。第一个的错误原因是分隔符是空格,逗号会算进变量名。第二个简化点说就是怎么把一个chararray按规则展开成bag,似乎可以写UDF看看。

      Reply
  • 2012 年 03 月 21 日 at 13:51
    Permalink

    数据格式为((a1,b1),(a2,b2),...),数量不确定,位于一个HBase的column内,这样的schema怎么定义呢。

    Reply
    • 2012 年 03 月 21 日 at 14:22
      Permalink

      找一个HBase的loader试试吧,我没有用Pig从HBase中加载过数据,所以在这里无法具体回答你

      Reply
      • 2012 年 03 月 22 日 at 10:33
        Permalink

        两个小问题:
        1.
        A = LOAD 'test_logs' using org.apache.pig.backend.hadoop.hbase.HBaseStorage('tag:key, ') as (o:chararray);
        正常。
        A = LOAD 'test_logs' using org.apache.pig.backend.hadoop.hbase.HBaseStorage('tag:key, response:code') as (o:chararray, c:int);
        缺失key这一列。
        (,200)
        (,304)
        A = LOAD 'test_logs' using org.apache.pig.backend.hadoop.hbase.HBaseStorage('tag:key, response:code, tag:eclipsed_time') as (o:chararray, c:int, e:double);
        于是没有返回。

        2. 数据看起来是这样的,但实际上每一行都是chararray:
        ((a,1),(b,2))
        ((a,1),(b,1),(c,3))
        我想找出a,b,c的个数,最好能按后面的数字group一下。

        初学,不好意思。

        Reply
        • 2012 年 12 月 19 日 at 17:15
          Permalink

          请问,能把Pig操作HBase数据的使用方法给我说下不???

          Reply
            • 2013 年 01 月 25 日 at 11:05
              Permalink

              请问这个“com.twitter.elephantbird.pig.store.LzoPigStorage”的jar在哪里?我在pig-0.10.0中没有找到,求指点

              Reply
                • 2013 年 01 月 28 日 at 10:00
                  Permalink

                  能具体说下 下载的文件夹不?需要使用压缩格式进行存储数据

                • 2013 年 01 月 28 日 at 15:13
                  Permalink

                  不明白你的意思。如果你是指从我给的链接中找不到jar包,那么我的回答是:我给的链接是源码,需要自己check out下来,ant编译出jar包。

        • 2012 年 12 月 19 日 at 17:17
          Permalink

          hbase数据如下:
          row1 column=c1:a, timestamp=1354847770755, value=L3
          row1 column=c1:b, timestamp=1354847834456, value=L3

          Reply
  • 2012 年 03 月 04 日 at 21:20
    Permalink

    楼主,总结的不错,非常受益!
    学习精神和分享精神值得钦佩!

    Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注