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

      1. 谢谢楼主,问题解决的,还有一个问题pig_classpath是怎么配置的,引入第三方包,总是不行,比如chukwa的pig支持,以及hcatalog的支持等,执行的时候外部的方法总是不好使,关键是该如何调试。

  1. 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呢??????

    1. (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,)})

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

  2. 程序如下:
    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

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

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

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

  3. 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

    该怎样解决???

  4. 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语法,从而使后面的代码乱码。所以,请自行把上面的那些空格去掉。

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

      1. 两个小问题:
        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一下。

        初学,不好意思。

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

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

发表评论

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