0

私は豚で最初のUDFを試していて、次の関数を書きました-

package com.pig.in.action.assignments.udf;

import org.apache.pig.EvalFunc;
import org.apache.pig.PigWarning;
import org.apache.pig.data.Tuple;

import java.io.IOException;


public class CountLength extends EvalFunc<Integer> {

    public Integer exec(Tuple inputVal) throws IOException {

        // Validate Input Value ...
        if (inputVal == null ||
            inputVal.size() == 0 ||
            inputVal.get(0) == null) {

            // Emit warning text for user, and skip this iteration
            super.warn("Inappropriate parameter, Skipping ...",
                       PigWarning.SKIP_UDF_CALL_FOR_NULL);
            return null;
        }

        // Count # of characters in this string ...
        final String inputString = (String) inputVal.get(0);

        return inputString.length();

    }

}

ただし、次のように使用しようとすると、UDF のコンテキストで少なくとも理解するのが簡単ではないというエラー メッセージが Pig からスローされます。

grunt> cat dept.txt;
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON

grunt> dept = LOAD '/user/sgn/dept.txt' USING PigStorage(',') AS (dept_no: INT, d_name: CHARARRAY, d_loc: CHARARRAY);
grunt> d = FOREACH dept GENERATE dept_no, com.pig.in.action.assignments.udf.CountLength(d_name);

2015-06-02 16:24:13,416 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 2, column 79>  mismatched input '(' expecting SEMI_COLON
Details at logfile: /home/sgn/pig_1433261973141.log

これの何が問題なのかを理解するのを手伝ってくれる人はいますか?

ドキュメントを確認しましたが、上記のサンプルで明らかな誤りはないように思われます。ここで何か不足していますか?

これらは私が pom.xml で使用しているライブラリです:

<dependency>
    <groupId>org.apache.pig</groupId>
    <artifactId>pig</artifactId>
    <version>0.14.0</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-core</artifactId>
    <version>1.2.1</version>
</dependency>

互換性の問題はありますか?

ありがとう、

-Vipul Pathak;

4

3 に答える 3

2

上記の例を試しました。jar が REGISTER コマンドを使用して登録され、jar がクラスパスで使用可能である限り、エラーは表示されません。

REGISTER myudfs.jar;
dept = LOAD 'a.csv' USING PigStorage(',') AS (dept_no: INT, d_name: CHARARRAY, d_loc: CHARARRAY);
d = FOREACH dept GENERATE dept_no, CountLength(d_name) as length;

入力: a.csv

10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON

出力 : d

(10,10)
(20,8)
(30,5)
(40,10)

注意: 上記の実行では、クラス CountLength がデフォルトのパッケージで定義されています。

このクラス - CountLength がパッケージ com.pig.utility で定義されている場合、UDF にアクセスするには、以下のように DEFINE ステートメントが必要です。

DEFINE CountLength com.pig.utility.CountLength;

また

以下のように、完全なパスで UDF を参照する必要があります。

d = FOREACH dept GENERATE dept_no, com.pig.utility.CountLength(d_name) as length;
于 2015-06-03T05:31:55.783 に答える