0

埋め込まれたPigスクリプト(Pythonに埋め込まれている)を実行しようとしています。ここで、スクリプトの出力/結果を取得し、それを入力としてスクリプトにフィードバックする必要があります。これを行う簡単な方法があると確信していますが、すべての例は非常に単純に見え、1列の例を使用しています。

私の入力は次のようになります: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 = outputとだけ言えればいいのですが、うまくいきません。私も試しました:

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

これにより、出力が入力にプッシュバックされましたが、LOAD関数はそれを読み取ることができませんでした。それは1つの大きな記録のように見えたので-

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); 

私はこれを行うためのいくつかの簡単な方法を見逃していると確信しています。

4

1 に答える 1

1

クイックアンサー:変更

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

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

説明:params配列は、Pigスクリプト内のパラメーター置換用であることを忘れないでください。そのため、次のLOADステートメントはそのように見えました。前の実行の出力を取得し、「これらの結果を取得して文字列に入れ、この文字列を入力データのファイル名として解釈する」と言いました。

もうすぐです。paramsディクショナリには、inputとoutFileの2つの要素があります。スクリプトは入力からロードされ、outFileに保存されます。したがって、スクリプトを実行した後、input=outFileを設定します。次に、次の反復はoutFileからロードされます。必ず新しいoutFileを指定してください。そうしないと、ディレクトリがすでに存在するため、STOREできなくなります。

于 2012-11-06T20:50:33.230 に答える