あなたの質問に対する答えは2つあります。
まず、Hive QL構文で表現できる処理がある場合、Hiveのパフォーマンスはカスタムmap-reduceの作成と同等であると私は主張します。ここでの唯一の落とし穴は、マップリデュースコードで使用しているがHiveでは使用していないデータに関する追加情報がある場合です。たとえば、データが並べ替えられている場合、マッパーでファイル分割を処理するときにこの情報を利用できますが、Hiveがこの並べ替え順序を認識していない限り、この情報を利用することはできません。アドバンテージ。多くの場合、(メタデータまたは構成プロパティを介して)そのような追加情報を指定する方法がありますが、Hiveで使用するためにこの情報を指定する方法さえない場合もあります。
次に、SQLのようなステートメントで簡単に表現できないほど、処理が複雑になる場合があります。これらのケースでは通常、処理中に断続的な状態を保存する必要があります。Hive UDAFは、この問題をある程度軽減します。ただし、もっとカスタムなものが必要な場合は、 HiveTransform機能を使用してカスタムマッパーやレデューサーを接続することを常にお勧めします。これにより、Hiveクエリのコンテキスト内でmap-reduceを利用できるようになり、HiveSQLのような機能をカスタムのmap-reduceスクリプトとすべて同じクエリで組み合わせることができます。
簡単に言うと、Hive QLクエリを使用して処理を簡単に表現できる場合、同じことを実現するためにmap-reduceコードを作成する理由はあまりありません。Hiveが作成された主な理由の1つは、map-reduceを作成する代わりに、私たちのような人々がSQLのようなクエリを作成できるようにすることでした。(パフォーマンス上の理由などで)典型的なHiveクエリの代わりにmap-reduceを作成することになった場合、Hiveはその主な目的でうまく機能していないと主張することができます。一方、Hiveが利用できないデータに関する情報がある場合は、その情報を利用するカスタムmap-reduce実装を作成する方がよい場合があります。ただし、前述のように、Hive変換機能を使用してマッパーとリデューサーをプラグインするだけでよい場合は、map-reduceプログラム全体を作成する必要はありません。