UDF(用户定义函数)python在pig

时间:2016-08-22 14:16:14

标签: python apache-pig jython udf

我想为pig编写一个UDF python来读取名为

的文件中的行
#'prefix.csv' 
spol.
LLC 
Oy
OOD

并匹配名称,如果找到任何匹配项,则将其替换为空格。这是我的python代码

def list_files2(name, f):
    fin = open(f, 'r')
    for line in fin:
        final = name
        extra = 'nothing'
        if (name != name.replace(line.strip(), ' ')):
            extra = line.strip()
            final = name.replace(line.strip(), ' ').strip()
            return final, extra,'insdie if'
    return final, extra, 'inside for'

在python中运行此代码,

>print list_files2('LLC nakisa', 'prefix.csv' )
>print list_files2('AG company', 'prefix.csv' )

返回

 ('nakisa', 'LLC', 'insdie if')
 ('AG company', 'nothing', 'inside for')

这正是我需要的。但是当我在这个样本列表的apache pig中将此代码注册为UDF时:

nakisa company LLC
three Oy 
AG Lans 
Test OOD

猪在第三行回答错误答案:

((nakisa company,LLC,insdie if))
((three,Oy,insdie if))
((A G   L a n s,,insdie if))
((Test,OOD,insdie if))

问题是为什么UDF为prefix.csv文件中没有任何匹配的第三个条目输入if循环。

1 个答案:

答案 0 :(得分:0)

我不知道pig但你检查比赛的方式很奇怪,可能是你问题的原因。

如果要检查字符串是否是另一个字符串的子字符串,python提供 字符串上的find方法:

if name.find(line.strip()) != -1:
    # find will return the first index of the substring or -1 if it was not found
    # ... do some stuff

另外,您的代码可能会使文件句柄保持打开状态。处理文件操作的更好方法是使用with语句。这确保了在任何情况下(解释器崩溃除外)文件句柄都将被关闭。

with open(filename, "r") as file_:
    # Everything within this block can use the opened file.

最后但并非最不重要的是,python提供了一个名为csv的模块,其中包含readerwriter,用于处理csv文件格式的解析。

因此,您可以尝试以下代码并检查它是否返回正确的内容:

import csv

def list_files2(name, filename):
    with open(filename, 'rb') as file_:
        final = name
        extra = "nothing"
        for prefix in csv.reader(file_):
            if name.find(prefix) != -1:
                extra = prefix
                final = name.replace(prefix, " ")
                return final, extra, "inside if"
        return final, extra, "inside for"

因为您的文件名为prefix.csv,我假设您要进行前缀替换。在这种情况下,您可以使用startswith代替find进行检查,并将行final = name.replace(prefix, " ")替换为final = " " + name[name.find(prefix):]。这样可以确保只用空格替换前缀。

我希望,这有助于