Pig的Python UDF:数据类型转换错误

Posted

技术标签:

【中文标题】Pig的Python UDF:数据类型转换错误【英文标题】:Python UDF for Pig: datatype conversion error 【发布时间】:2012-10-02 02:07:07 【问题描述】:

我正在使用 Python UDF,它在减少阶段会导致错误。

java.lang.ClassCastException: java.lang.Double cannot be cast to org.apache.pig.data.DataByteArray

这是 UDF 的代码:

import math
outputSchema("score:double")
def confidenceLowerBound(numerator, denominator, constant):
    raw_score = numerator * 1.0 / denominator
    normalized_interval = math.sqrt( raw_score * (1 - raw_score) / denominator )

    wilson_score = raw_score - constant * normalized_interval
    return wilson_score

这就是我在 pig 中调用 udf 的方式。

register 'confidence_interval_compute.py' using jython as pyutils;
...
..
A = FOREACH A GENERATE $0, $1, $2, $3, $4, pyutils.confidenceLowerBound($3, $4, 4) AS score PARALLEL 20;

【问题讨论】:

A 的架构如何看起来像您迭代的?你用的是哪个 Pig 版本? 我希望这是一个错字,但是您在 outputSchema 之前缺少 @ (即 @outputSchema("score:double") 。如果缺少,则不会调用装饰器,这意味着 Pig 不会知道输出是双倍的。 【参考方案1】:

正如@Ian Stevents 在 cmets 中指出的那样,这是因为您在装饰器中有错字。

你应该使用

@outputSchema("score:double")

【讨论】:

以上是关于Pig的Python UDF:数据类型转换错误的主要内容,如果未能解决你的问题,请参考以下文章

Pig:完成 UDF 后执行任务

是否可以在 pig java udf 中使用 pig 内置函数

Pig 中的 Python UDF

Pig into Cassandra - 使用 python UDF 和 CqlStorage 传递列表对象

在 Pig 中将关系传递给 Python UDF 时出错

PIG UDF (Python) 字符集编码