このブログでは、HBaseの概念実証のサンプルについて説明します。
以下の画像のようなデータセットがあります。
このデータセットは、特定の日付に特定の携帯電話番号から送信された着信通話、発信通話、およびメッセージの合計時間に関する詳細で構成されます。
最初のフィールドは日付、2番目のフィールドは携帯電話番号、3番目のフィールドは着信コールの合計期間、4番目のフィールドは発信コールの合計期間、5番目のフィールドは送信されたメッセージの合計数を表します。
ここでのタスクは、特定の日付の電話番号から、送信された着信および発信の通話とメッセージの期間の情報を取得することです。
このユースケースでは、15のレコードをフィルタリングしようとしていますth2014年3月。これを実現するためのHBaseプログラムがあります。
以下はその完全なコードです。
公衆 クラス サンプル{{
民間 静的 構成 conf
静的 HTable テーブル
マージソートc ++アルゴリズム
公衆 sample(String tableName、String colFams) 投げる IOException {
conf = HBaseConfiguration。 作成する ()
createTable(tableName、colFams)
テーブル = 新着 HTable( conf 、tableName)
}
ボイド createTable(String tableName、String colFams) 投げる IOException {
HBaseAdmin hbase = 新着 HBaseAdmin( conf )
HTableDescriptor desc = 新着 HTableDescriptor(tableName)
HColumnDescriptor meta = 新着 HColumnDescriptor(colFams.getBytes())
desc.addFamily(meta)
hbase.createTable(desc)
}
公衆 静的 ボイド addColumnEntry(String tableName、String row、
文字列colFamilyName、文字列colName、文字列値)
投げる IOException {
バイト [] rowKey =バイト。 toBytes (行)
putdata =を置く 新着 Put(rowKey)
putdata.add(Bytes。 toBytes (colFamilyName)、バイト。 toBytes (colName)、
バイト。 toBytes (値))
テーブル .put(putdata)
}
公衆 静的 ボイド getAllRecord(String tableName、String startPartialKey、
文字列endPartialKey) 投げる IOException {
試してみてください {{
スキャン
もし (startPartialKey == ヌル || endPartialKey == ヌル )
s = 新着 スキャン()
そうしないと
s = 新着 Scan(Bytes。 toBytes (startPartialKey)、
バイト。 toBytes (endPartialKey))
ResultScanner ss = テーブル .getScanner(s)
HashMap
文字列imsi =“”
ために (結果r:ss){
HashMap keyVal = 新着 HashMap()
ために (KeyValue kv:r.raw()){
imsi = 新着 String(kv.getRow())。substring(10)
keyVal.put( 新着 String(kv.getQualifier())、
新着 String(kv.getValue()))
outputRec.put(imsi、keyVal)
もし (keyVal.size()== 3)
システム。 でる .println(take +”” +“着信分:”
+ keyVal.get(“ c1”)+”今後の議事録:”
+ keyVal.get(“ c2”)+”メッセージ:”
+ keyVal.get(“ c3”))
}
}
} 最終的に {{
}
}
公衆 静的 ボイド main(String [] args) 投げる IOException {
String tableName =“ daterecords”
文字列colFamilyNames =“ i”
サンプルテスト= 新着 sample(tableName、colFamilyNames)
String fileName =“ / home / cloudera / Desktop / data”
//これは一度に1行を参照します
文字列行= ヌル
試してみてください {{
// FileReaderは、デフォルトのエンコーディングでテキストファイルを読み取ります。
FileReader fileReader = 新着 FileReader(fileName)
// FileReaderを常にBufferedReaderでラップします。
BufferedReader bufferedReader = 新着 BufferedReader(fileReader)
C ++でソートを使用する方法
一方 ((line = bufferedReader.readLine())!= ヌル ){
String [] values = line.split(”“)
addColumnEntry (tableName、values [0] +“-” + values [1]、
colFamilyNames、“ c1”、values [2])
addColumnEntry (tableName、values [0] +“-” + values [1]、
colFamilyNames、“ c2”、values [3])
addColumnEntry (tableName、values [0] +“-” + values [1]、
colFamilyNames、“ c3”、values [4])
}
bufferedReader.close()
} キャッチ (FileNotFoundException ex){
システム。 でる .println(“ファイル ‘” + fileName +“‘”を開けません)
} キャッチ (IOException ex){
システム。 でる .println(“ファイル ‘” + fileName +“‘”の読み取りエラー)
//または、これを行うこともできます:
// ex.printStackTrace()
}
getAllRecord (tableName、「20140315」、「20140316」)
}
}
ここでは、Configuration、HTableクラスのオブジェクトを作成し、次の名前でHbaseテーブルを作成しました。 daterecords および列ファミリ: 私 。
このユースケースでは、日付と携帯電話番号の組み合わせを「-」で区切ってこのHbaseテーブルの行キーとして使用し、着信、発信通話時間、送信されたメッセージの数を列「c1」、「」として使用します。列ファミリー 'i'の場合はc2 '、' c3 '。
Clouderaのローカルファイルシステムに入力データが保存されています。したがって、ファイルからデータを読み取るJavaLogicを作成する必要があります。
math.absはJavaで何をしますか
以下はJavaロジックです。
この方法では、列ファミリーの各列のテーブルにデータを格納します。
scanコマンドを使用して、Hbaseテーブル「daterecords」に保存されているデータを確認できます。
下の画像のようにデータを受け取ります。
これで、データがHBaseテーブルに正常に挿入されました。
特定の日付のテーブルに保存されているレコードを取得してみましょう。
このユースケースでは、日付のレコードを取得しようとしています:15th2014年3月
レコードを取得するために、メソッドを作成しました
getAllRecord(String tableName、String startPartialKey、String endPartialKey)
最初のパラメーターはテーブル名を表し、2番目はデータを取得する必要がある開始日を表し、3番目は開始日の次の日付を表します。
例えば:
getAllRecord(tableName、“ 20140315”、“ 20140316”)
今、私たちは理解しましょう 論理 この方法の。
startPartialKeyとendPartialKeyを使用してHBaseAPIを使用してHbaseテーブルをスキャンしようとしています。
StartPartialKeyとendPartialkeyはnullではないため、elseブロックに移動し、startPartialKeyの値を持つレコードをスキャンします。
Hbaseテーブルのスキャンされたレコードを格納するResultスキャナーのオブジェクトと、結果となる出力を格納するHashMapを作成しました。
Resultスキャナーでデータストアを取得するためのResultのオブジェクトを作成し、forループを実行しています。
imsiは携帯電話番号を格納するために定義された文字列であり、keyValは特定の電話の列から取得した出力を格納するハッシュマップです。
私たちは与えました 20140315-1234567890 として 行キー Hbaseテーブルに。この20140315は日付を表し、1234567890は携帯電話番号を表します。
携帯電話番号のみが必要なため、部分文字列メソッドを使用して取得しています。
r.raw()からデータを取得し、Putを使用してHashMapに保存しています。
最後に、それらをコンソールに印刷しようとしています。
出力は下の画像のようになります。
日付のレコードを正常に取得しました:15th2014年3月。