1. ホーム
  2. hadoop

[解決済み] Pig:FLATTENキーワード

2022-02-16 05:29:34

質問

の使い方で少し迷っています。 FLATTEN というキーワードをPIGで使用しています。

以下のデータセットについて考えてみましょう。

tuple_record: {details: (firstname: chararray,lastname: chararray,age: int,sex: chararray)}

を使用せずに FLATTEN こんな感じで、フィールド(firstnameとする)にアクセスできるんです。

display_firstname = FOREACH tuple_record GENERATE details.firstname;

ここで FLATTEN というキーワードがあります。

flatten_record = FOREACH tuple_record GENERATE FLATTEN(details);

DESCRIBE はこれを与えてくれる。

flatten_record: {details::firstname: chararray,details::lastname: chararray,details::age: int,details::sex: chararray}

そのため、このフィールドに直接アクセスすることができます。 dereferencing のようにします。

display_record = FOREACH flatten_record GENERATE firstname;

これに関する質問 FLATTEN というキーワードがあります。

1)2つのうちどちらを使うか(すなわち FLATTEN は、同じ出力を得るために最適化された方法ですか?

2) 特別なシナリオがある場合。 FLATTEN というキーワードがある場合、期待する出力は得られないのでしょうか?

どのような場面で使うのか、用途を明確に教えてください。

どのように解決するのですか?

  1. バッグやタプルの中にデータがあり、そのレベルのネストを削除したい場合があります。
  2. データをその場で切り替えたり、特定のフィールドでグループ化したりしたい場合、バッグからそれらのエントリを取り出す方法が必要です。

Pigのドキュメントにある通りです。

FLATTEN演算子は、構文的にはUDFのように見えますが、その正体は 実際には、タプルとバッグの構造を変更する演算子である。 UDFでは不可能な方法です。Flattenはタプルやバッグの入れ子を解除する。これは 考え方は同じですが、操作と結果がそれぞれ異なります。 のような構造を持つ。

詳細はこちらをご覧ください。 このリンク FLATTENの使い方が例文付きでわかりやすく説明されています。