0

私はCascadingとHadoopの両方に非常に慣れていないので、優しくしてください... :-D

私は自分自身が何かを過度に設計していることに気付いていると思います。基本的に私の状況は、9 つ​​のフィールドを持つパイプで区切られたファイルを持っているということです。異なるグループ化を使用して、これらの 9 つのフィールドの集計統計を計算したいと考えています。結果は 10 個のフィールドで、そのうち 6 個だけがカウントまたは合計になります。これまでのところ、Unique パイプは 4 つ、CountBy パイプは 4 つ、SumBy は 1 つ、GroupBy は 1 つ、Every は 1 つ、Each は 2 つ、CoGroup は 5 つ、その他数個です。別の小さな機能を追加する必要がありますが、それを行う唯一の方法は、2 つのフィルター、さらに 2 つの CoGroup、およびさらに 2 つの各パイプを追加することです。これは、いくつかの集約された統計を計算するためだけにやり過ぎのように思えます。だから私は本当に何かを誤解していると思っています。

私の入力ファイルは次のようになります。

storeID | invoiceID | groupID | customerID | transaction date | quantity | price | item type | customer type

アイテム タイプは、在庫、サービス、またはグループ アイテムの「I」、「S」、または「G」のいずれかであり、顧客はグループに属します。残りは自明であるべきです

私が望む結果は次のとおりです。

project ID | storeID | year | month | unique invoices | unique groups | unique customers | customer visits | inventory type sales | service type sales |

プロジェクト ID は定数です。顧客の訪問数は、顧客が来て何かを購入した月の日数です。

私が現在使用している設定では、ソースとして TextDelimited Tap を使用してファイルを読み取り、DateParser を使用してトランザクションの日付を解析し、年、月、日のフィールドに追加する Each パイプにレコードを渡します。ここまでは順調ですね。これが制御不能になるところです。

そこからのストリームを 5 つの個別のストリームに分割して、必要な集計フィールドのそれぞれを処理しています。次に、すべての結果を 5 つの CoGroup パイプに結合し、Insert (プロジェクト ID を挿入するため) を介して結果を送信し、TextDelimited シンク Tap を介して書き込みます。

そのように5つのストリームに分割するよりも簡単な方法はありますか? 最初の 4 つのストリームは、フィールドが異なるだけでほぼ同じことを行います。たとえば、最初のストリームは Unique パイプを使用して一意の InvoiceID を取得し、次に CountBy を使用して、同じ storeID、年、月を持つレコードの数をカウントします。これにより、店舗ごとに年月ごとに作成された一意の請求書の数がわかります。次に、groupID で同じことを行うストリームと、customerID で行う別のストリームがあります。

これを簡素化するためのアイデアはありますか? もっと簡単な方法があるはずです。

4

0 に答える 0