2016-07-21 5 views
0

私はサブスクリプションテーブルを次のようにしています。 ユニークなIDは約1百万件あります。 この表には、ユーザーがサブスクリプションサービスを開始したときのサブスクリプションのステータスが 'Sub'で示され、サブスクリプションが 'Usub'と示されている場合のサブスクリプションステータスがリストされています。列自体と日付で決まる列の欠損値を入力してください

ID Year Month Status 
A 2014 1  
A 2014 2  
A 2014 3  
A 2014 4 Sub 
A 2014 5  
A 2014 6  
A 2014 7  
A 2014 8 Usub 
A 2014 9  
A 2014 10  
A 2014 11  
A 2014 12  
B 2014 1  
B 2014 2  
B 2014 3  
B 2014 4  
B 2014 5 Usub  
B 2014 6  
B 2014 7  
B 2014 8  
B 2014 9 Sub 
B 2014 10  
B 2014 11  
B 2014 12  
. . .  . 
. . .  . 
. . .  . 

各ステータスの更新間隔を埋めるために探しています。 所望の出力テーブルには、次のようになり:

ID Year Month Status 
A 2014 1 Usub 
A 2014 2 Usub 
A 2014 3 Usub 
A 2014 4 Sub 
A 2014 5 Sub 
A 2014 6 Sub 
A 2014 7 Sub 
A 2014 8 Usub 
A 2014 9 Usub 
A 2014 10 Usub 
A 2014 11 Usub 
A 2014 12 Usub 
B 2014 1 Sub 
B 2014 2 Sub 
B 2014 3 Sub 
B 2014 4 Sub 
B 2014 5 Usub 
B 2014 6 Usub 
B 2014 7 Usub 
B 2014 8 Usub 
B 2014 9 Sub 
B 2014 10 Sub 
B 2014 11 Sub 
B 2014 12 Sub 
. . .  . 
. . .  . 
. . .  . 

最初の表は、両方のユーザーが一つの状態変化よりも多くを持って示しているが、任意の所与のIDは、必ずしも複数の状態変化を有していません。ただし、各IDには少なくとも1つのステータスがあります。すなわち、 2014/8で購読し、決して購読していないユーザーは、2014/8でstatus = Subとなります。

+0

** MySQL **または** Hive **?!で実行しますか?通常のSQLはそうしないので、いくつかの手続きを必要とします。 –

+0

@サムソン、私はハイブでそれをやりたいですが、mysqlのアプローチも受け入れます。 – ohmyan

答えて

0

手続きコードでデータを順番に読み取って、変数を使用して以前のレコードの "状態"を保存することができます(新しいIDごとにリセットされます)。
しかし、SQLはではなく、手続きです。

so どのような手続き型ラッパー標準的な単一ノードデータベース(MySQLなど)と分散システム(Hiveなど)を入手できますか?

  • MySQLがSELECTクエリからの行のカーソルへ 反復処理をサポートしているストアドプロシージャ言語を持っているにも
  • ハイブ2.0(Googleはあなたにランダムに撮影したthis oneのようなチュートリアルの大規模な数を取得します) procedural language extensionの種類がありますが、 はHive自体の一部ではありません。 specific toolで手続きスクリプトを実行する必要があります(とにかく誰もがHive 2.0を持っているわけではありません)。また、Hiveは分散ファイルシステム上で分散クエリを実行します。単一のクライアント上のすべての行を「シャッフル」するノードは、単一スレッドのツールで反復処理することは非常に不器用なように聞こえる - 自己責任で調査する
  • ハイブには複雑な煩雑な方法がある分散した方法で任意の手続き型コードを実行する(各マッパーまたは各リダンサーで) TRANSFORM句(旧バージョンではあまり有名ではない「Hadoopストリーミング」機能のHive訳)。残念ながらthe documentation is cryptic(あなたがより良いオライリーから良い古書例えば「プログラミングハイブ」を取得したい)と、あなたが最終的にそれを動作させることができたときに、よく、パフォーマンスの低下が
  • 重要であるか、あなたは開発することがあり少しひねりを加えたJavaでカスタムハイブUDF - つまり今、、手続きロジックのどのようなあなたが実装する必要がありますJava変数で前の行からの状態を保存し、それを現在の行の

を使用してあなたのカスタムクエリとカスタムコードで?最初

  • は、あなたが、あなたはまた、すべてのキーが全体としてその歴史を処理したように、キーBY配布する必要があり、ハイブTRANSFORMまたはハイブUDFと日付
  • 、入力されたクエリがキーでソートする必要があります単一ノードに(それ以外の結果は全く意味を成さないだろう!)
  • は、「PreviousRowKey」と1行目の「PreviousRowState」
  • 、またはキーの変化に2つの変数を定義し、「PreviousRowState = Usub」 「PreviousRowKey = currentKey」
  • の状態の変更時に "PreviousRowState = currentState" else強制 "currentState = PreviousRowState"
関連する問題