1

ユーザー、好きな果物のコレクション、および出身地を示す一連のデータがあります。

Alice\tApple:Orange\tSacramento
Bob\tApple\tSan Diego
Charlie\tApple:Pineapple\tSacramento

さまざまな都市で果物のタイプを楽しんでいるユーザーの数を相関させる豚のクエリを作成したいと思います。上記のデータのクエリの結果は次のようになります。

Apple\tSacramento\t2
Apple\tSan Diego\t1
Orange\tSacramento\t1
Pineapple\tSacramento\t1

私が理解できない部分は、分割されたフルーツの行を同じ行の残りのデータと交差結合する方法です。

Alice\tApple:Orange\tSacramento

になります:

Alice\tApple\tSacramento 
Alice\tOrange\tSacramento

TOKENIZEを使用して、文字列'Apple:Orange'をタプル('Apple'、'Orange')に分割できることは知っていますが、そのタプルと残りの行の外積を取得する方法がわかりません('Apple'、'Orange')。 「アリス」)。


私が思いついた力ずくの解決策の1つは、ストリーミングを使用して外部プログラムを介して入力コレクションを実行し、「クロス結合」を処理して、行ごとに複数の行を生成することです。

ただし、これは不要のようです。より良いアイデアはありますか?

4

1 に答える 1

1

を使用する必要があります。これは、このようなことを行うのにFLATTEN最適です。TOKENIZE

b = FOREACH a GENERATE name, FLATTEN(TOKENIZE(fruits)) as fruit, city;

FLATTENバッグを取り出し、さまざまな列に「平らに」します。TOKENIZE果物を袋に分けて(あなたが言ったようなタプルではありません)、次にFLATTENあなたが探しているような十字架のような振る舞いをします。FLATTENオーバーロードされ、タプルとは異なる動作をするため、これはバッグであり、タプルではないことを指摘します。

FLATTEN私は最初に、標準的な単語数の例で/テクニックを学びTOKENIZEました。この例では、単語をトークン化し、次に単語を行にフラット化します。

于 2011-09-14T02:01:38.540 に答える