2

豚の関係のフィルターを実行しようとしています。最初のフィールド文字列に 3 番目のフィールドが出現するすべてのレコードが必要です。

私は試しました:(ソース関係がSRCであると仮定します)

Filtered= FILTER SRC BY $0 matches 'CONCAT(".*",$2,".")';
DUMP Filtered;

構文エラーはありませんが、Filtered の出力が得られません。

4

4 に答える 4

4

Pig のCONCAT引数は 2 つだけです。http://pig.apache.org/docs/r0.10.0/func.html#concatのドキュメントを参照してください。

実行時に文句を言わない理由はわかりませんが、次のように 2 つのCONCATステートメントをつなぎ合わせたいと思うでしょう。

CONCAT(".*", CONCAT($2, "."))

必要な文字列を取得します。

于 2012-09-13T18:44:22.923 に答える
2

CONCATが期待どおりに解決しているとは思わないので、一致はおそらく評価されていない文字列全体と一致しようとしているためCONCAT(".*",$2,".")、結果が得られません。

これを2つのステートメントに分割できますか。1つ目はCONCATの評価されたコンテンツを含むフィールドを作成し、もう1つは一致操作を実行します。

TMP = FOREACH SRC GENERATE $0, CONCAT(".*",$2,".");
Filtered = FILTER TMP BY $0 matches $1;
DUMP Filtered;

またはそのようなもの(完全にテストされていません)

于 2012-04-25T12:46:06.357 に答える
1

構文エラーがあるだけだと思います

  • A. Leistra が指摘したように、CONCAT は 2 つの引数しか取りません。
  • 「。」両面ワイルドカードが必要な場合は、最後に「.*」を付ける必要があります
  • FILTER ステートメントは、引数を括弧で囲むことを優先します
  • Pig には、二重引用符を含む多くの奇妙なエッジ ケースがあるため、可能な場合は single を使用してください。

Filtered= FILTER SRC BY ($0 matches CONCAT('.*', CONCAT($2, '.*')));

于 2014-04-17T05:04:44.197 に答える
0

これを試して、

Filtered= FILTER SRC BY $0 matches '(.*)$2(.*)';

DUMP Filtered;

3 番目のフィールドに最初のフィールドが含まれている場合、その結果はフィルター処理されます。これは正規表現を使用して行われます。

于 2014-07-16T01:37:34.537 に答える