Pig 脚本无法注册 UDF

Posted

技术标签:

【中文标题】Pig 脚本无法注册 UDF【英文标题】:Pig script cannot register UDF 【发布时间】:2015-04-08 18:14:21 【问题描述】:

我有一个简单的 Pig 脚本,它使用我创建的 Python UDF。如果我删除 UDF 部分,脚本就可以完成。但是当我尝试注册我的 UDF 时,我收到以下错误:

ERROR 2997: Encountered IOException. File pig_test/py_udf_substr.py does not exist

这是我的 UDF:

@outputSchema("chararray")
def get_fistsn(data,n):
    return data[:n]

这是我的猪脚本:

REGISTER 'pig_test/py_udf_substr.py' USING jython as pyudf;

A = load 'pig_test/sf.txt' using PigStorage(',')
as (Unique_flight_ID,Year,Month,Day,DOW,
Scheduled_departure_time,Scheduled_arrival_time,
Airline,Flight_number,Tail_number,Plane_model,
Seat_configuration,Departure_delay,Origin_airport,
Destination_airport,Distance_travelled,Taxi_time_in,
Taxi_time_out,Cancelled,Cancellation_code,target);

B = FOREACH A GENERATE Unique_flight_ID, pyudf.get_fistsn($0,3);

DUMP B;

我正在使用 HUE 来运行 Pig。数据和 UDF 都在同一个 HDFS 位置 (pig_test)。

【问题讨论】:

【参考方案1】:

根据您收到的错误,问题不在于脚本。它的 IOException- 框架无法读取 UDF。您可以尝试给出 UDF 的完整路径,看看是否有效。使用新终端尝试使用 cat 命令打开文件,看看路径是否正确。

ERROR 2997: Encountered IOException. File pig_test/py_udf_substr.py does not exist

【讨论】:

我最终不得不使用完整的路径 hdfs://nameservice1/user/myusername/pig_test/py_udf_substr.py。为什么 pig_test/sf.txt 可以很好地用于加载部分,但 pig_test/py_udf_substr.py 不能用于寄存器部分? 您需要将 UDF 放在本地,并将数据集放在 HDFS 中。【参考方案2】:

在编辑器中,您能否点击Properties,然后点击Resources,然后选择py_udf_substr.py 作为file

然后在您的脚本中,执行以下操作:

使用 jython 作为 pyudf 注册“py_udf_substr.py”;

【讨论】:

以上是关于Pig 脚本无法注册 UDF的主要内容,如果未能解决你的问题,请参考以下文章

在 PIg 脚本中对 Avro 文件使用 UDF

Unix Shell 脚本作为 Pig 和 Hive 的 UDF

Pig 中的 SimpleTextLoader UDF

UDF 可以访问调用 Pig 脚本中声明的参数或定义的值吗?

我可以在 Pig 脚本中将参数传递给 UDF 吗?

Apache Pig - 在脚本中多次调用 Java UDF ToJSON