2016-04-16 5 views
0

上ブタにバッグ内の要素を参照し、データ構造は、この(コマンドdescribeの結果)のようなものです、私が学生という別名を持っているHadoopの

studentIDInt:int,courses:bag{(courseId:int,testID:int,score:int)} 

その後、私はスコアで学生をフィルタリングしようとしているが、会っていますそのような豚の解析エラーでは、誰かが良いアイデアを持っている場合、それは素晴らしいでしょう。ありがとう。

エラーメッセージで報告された追加のタプルについて混乱します。

student = filter student by courses.score > 3; 

incompatible types in GreaterThan Operator left hand side:bag :tuple(score:int) right hand score:int 

に関して、 林

+1

(INT)courses.score> 3 maybe? –

+0

@BurakKarasoy、ありがとうございました。私は、データ構造に追加タプルがあると思う、これは約エラーですか?あなたはどのように思いますか? –

+0

@BurakKarasoyは、新しいエラーメッセージ 'スキーマbag {:tuple(score:int)} int 'にキャストできません。 –

答えて

1

あなたが直接それを行うことはできません。解決策は、最初に再び

flat_student = foreach student generate studentIDInt, flatten(courses); 
filtered_student = filter flat_student by score > 3; 
final_student = group filtered_student by studentIDInt; 

フィルタおよびグループよりももう一つの方法は、カスタムFilterFuncを書いている、平らにされているので、それが何を選択するのはあなた次第です。

+0

Alexeyさん、ありがとうございます。そして、なぜ、さらに平坦化が必要なのですか?ありがとう。 –

+1

カスタムUDFを書かずにバッグの要素に直接アクセスすることはできません。典型的なブタフィルター関数はスカラーを必要とします。つまり、タプル内の要素にアクセスできますが、バッグにはアクセスできません。 – Alexey

+0

Alexeyさん、ありがとうございました。私の例のコースは典型的なバッグですか、タプルを入れ子にした追加のレイヤーを備えたバッグですか? –

関連する問題