2012-11-03 66 views
0

我试图运行的嵌入式脚本猪(Python中内嵌),我需要把脚本的输出/结果并反馈到脚本的输入。我确信有一个简单的方法来做到这一点,但所有的例子似乎过于简单化,并使用一个列的例子。编译猪举动输出到输入

我的输入是这样的: networkMap.csv:

NodeH,4,-0.4 
NodeH,5,0.2 
NodeO,6,0.1 
Link,W_1_4,0.2,1,4 
Link,W_1_5,-0.3,1,5 
Link,W_2_4,0.4,2,4 
Link,W_2_5,0.1,2,5 
Link,W_3_4,-0.5,3,4 
Link,W_3_5,-0.2,3,5 
Link,W_4_6,-0.3,4,6 
Link,W_5_6,-0.2,5,6 
LR,LR,0.9 
Target,Target,1 

而且让我们的一个超级简单的例子就是我想要做的条带化了所有的应用程序逻辑来只专注于输入/输出问题:

#!/usr/bin/python 

from org.apache.pig.scripting import * 

P = Pig.compile(""" 
A = LOAD '$input' using PigStorage(',') AS (type:chararray, name:chararray, val:double,iName:chararray,jName:chararray); 

STORE A INTO '$outFile' USING PigStorage (','); 
""") 
params = { 'input': 'networkMap.csv'} 
for i in range(2): 
    outDir = "out_" + str(i + 1) 
    inputString = "" 
    params["outFile"] = "out_" + str(i + 1) 
    bound = P.bind(params) 
    stats = bound.runSingle() 
    if not stats.isSuccessful(): 
     raise 'failed' 
    params["input"] = stats.result("Output1") 

我希望我可以只说输入=输出,但不起作用。我也尝试过:

input = ""; 
iter = stats.result("A").iterator() 
while iter.hasNext(): 
    tuple = iter.next() 
    input = input + "(" +tuple.toDelimitedString(",") + ")" 
params["input"] = input  

这确实将输出压回到输入中,但后来LOAD函数无法读取它。因为它看起来像一个大记录 -

A = LOAD '(NodeI,1,1.0,,)(NodeI,2,0.0,,)(NodeI,3,1.0,,)(NodeH,4,-0.4,,)(NodeH,5,0.2,,)(NodeO,6,0.1,,)(Link,W_1_4,0.2,1,4)(Link,W_1_5,-0.3,1,5)(Link,W_2_4,0.4,2,4)(Link,W_2_5,0.1,2,5)(Link,W_3_4,-0.5,3,4)(Link,W_3_5,-0.2,3,5)(Link,W_4_6,-0.3,4,6)(Link,W_5_6,-0.2,5,6)(LR,LR,0.9,,)(Target,Target,1.0,,)' using PigStorage(',') AS (type:chararray, name:chararray, val:double,iName:chararray,jName:chararray); 

我敢肯定我缺少一些简单的方法来做到这一点。

回答

1

快速回答:变化

params["input"] = stats.result("Output1") 

params["input"] = params["outFile"] 

说明: 记住,你的参数数组是你的猪脚本中参数替换。这就是为什么你的下一个LOAD语句看起来是这样。您取出前一次运行的输出并说:“将这些结果放入一个字符串中,然后将此字符串解释为输入数据的文件名”。

你快到了。你的params字典中有两个元素:input和outFile。你的脚本从输入和存储装入outFile。所以在你运行脚本之后,设置input = outFile。然后你的下一次迭代将从outFile中加载。只要确保指定一个新的outFile,或者您将无法存储,因为该目录已经存在。