HBase常用操作

目錄:

引言 -- 參數(shù)基礎

1. 結構(Structural)過濾器--FilterList

2.列值過濾器--SingleColumnValueFilter

2.1.第一種構造函數(shù)情況 -- 比較的關鍵字是字符數(shù)組

2.2.第二種構造函數(shù)情況 -- 比較的關鍵字是比較器ByteArrayComparable

3.鍵值元數(shù)據(jù)

3.1. 基于列族過濾數(shù)據(jù)的FamilyFilter

3.2. 基于限定符Qualifier(列)過濾數(shù)據(jù)的QualifierFilter

3.3. 基于列名(即Qualifier)前綴過濾數(shù)據(jù)的ColumnPrefixFilter

3.4. 基于多個列名(即Qualifier)前綴過濾數(shù)據(jù)的MultipleColumnPrefixFilter

3.5. 基于列范圍(不是行范圍)過濾數(shù)據(jù)ColumnRangeFilter

4. RowKey

5. PageFilter

6. SkipFilter

7. Utility--FirstKeyOnlyFilter

8. 取得查詢結果

引言 -- 參數(shù)基礎

有兩個參數(shù)類在各類Filter中經常出現(xiàn),統(tǒng)一介紹下:

(1)比較運算符 CompareFilter.CompareOp

比較運算符用于定義比較關系半火,可以有以下幾類值供選擇:

EQUAL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 相等

GREATER? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 大于

GREATER_OR_EQUAL? ? ? ? ? 大于等于

LESS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 小于

LESS_OR_EQUAL? ? ? ? ? ? ? ? ? 小于等于

NOT_EQUAL? ? ? ? ? ? ? ? ? ? ? ? 不等于

(2)比較器? ByteArrayComparable

通過比較器可以實現(xiàn)多樣化目標匹配效果谱邪,比較器有以下子類可以使用:

BinaryComparator? ? ? ? ? ? ? 匹配完整字節(jié)數(shù)組

BinaryPrefixComparator? ? 匹配字節(jié)數(shù)組前綴

BitComparator

NullComparator

RegexStringComparator? ? 正則表達式匹配

SubstringComparator? ? ? ? 子串匹配

1. 結構(Structural)過濾器--FilterList

FilterList 代表一個過濾器鏈寝杖,它可以包含一組即將應用于目標數(shù)據(jù)集的過濾器辩撑,過濾器間具有“與” FilterList.Operator.MUST_PASS_ALL 和“或” FilterList.Operator.MUST_PASS_ONE 關系虹统。

官網實例代碼烂翰,兩個“或”關系的過濾器的寫法:

FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);? //數(shù)據(jù)只要滿足一組過濾器中的一個就可以

SingleColumnValueFilter filter1 = new SingleColumnValueFilter(

cf,

column,

CompareOp.EQUAL,

Bytes.toBytes("my value")

);

list.add(filter1);

SingleColumnValueFilter filter2 = new SingleColumnValueFilter(

cf,

column,

CompareOp.EQUAL,

Bytes.toBytes("my other value")

);

list.add(filter2);

Scan scan = new Scan();

scan.setFilter(list);

2. 列值過濾器--SingleColumnValueFilter

SingleColumnValueFilter 用于測試列值相等 (CompareOp.EQUAL ), 不等 (CompareOp.NOT_EQUAL),或單側范圍 (e.g., CompareOp.GREATER)蜒简。

構造函數(shù):

(1)比較的關鍵字是一個字符數(shù)組

SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, byte[] value)

(2)比較的關鍵字是一個比較器(比較器下一小節(jié)做介紹)

SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, ByteArrayComparable comparator)

2.1.第一種構造函數(shù)情況 -- 比較的關鍵字是字符數(shù)組

官網示例代碼蜡秽,檢查列值和字符串'my value' 相等:

SingleColumnValueFilter filter = new SingleColumnValueFilter(

cf,

column,

CompareOp.EQUAL,

Bytes.toBytes("my value")

);

scan.setFilter(filter);

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);

SingleColumnValueFilter filter = new SingleColumnValueFilter(

Bytes.toBytes("patentinfo"),

Bytes.toBytes("CREATE_TIME"),

CompareOp.EQUAL,

Bytes.toBytes("2013-06-08")

);

filterList.addFilter(filter);

Scan scan = new Scan();

scan.setFilter(filterList);

ResultScanner rs = table.getScanner(scan);

for (Result r : rs) {

System.out.println("Scan: " + r);

}

table.close();

注意:還是大寫問題府阀,HBase的列名必須大寫!

2.2.第二種構造函數(shù)情況 -- 比較的關鍵字是比較器ByteArrayComparable

該章節(jié)主要是針對SingleColumnValueFilter的第二種構造函數(shù)使用情況做了一些舉例:

(1)支持值比較的正則表達式 -- RegexStringComparator

官網示例代碼:

RegexStringComparator comp = new RegexStringComparator("my.");? //任意以my打頭的值

SingleColumnValueFilter filter = new SingleColumnValueFilter(

cf,

column,

CompareOp.EQUAL,

comp

);

scan.setFilter(filter);

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);

RegexStringComparator comp = new RegexStringComparator("2013-06-1.");

SingleColumnValueFilter filter = new SingleColumnValueFilter(

Bytes.toBytes("patentinfo"),

Bytes.toBytes("CREATE_TIME"),

CompareOp.EQUAL,

comp

);

filterList.addFilter(filter);

Scan scan = new Scan();

scan.setFilter(filterList);

ResultScanner rs = table.getScanner(scan);

for (Result r : rs) {

System.out.println("Scan: " + r);

}

table.close();

(2)檢測一個子串是否存在于值中(大小寫不敏感) -- SubstringComparator

官網示例代碼:

SubstringComparator comp = new SubstringComparator("y val");? // looking for 'my value'

SingleColumnValueFilter filter = new SingleColumnValueFilter(

cf,

column,

CompareOp.EQUAL,

comp

);

scan.setFilter(filter);

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);

//? ? ? ? RegexStringComparator comp = new RegexStringComparator("2013-06-1.");

SubstringComparator comp = new SubstringComparator("2013-06-1");

SingleColumnValueFilter filter = new SingleColumnValueFilter(

Bytes.toBytes("patentinfo"),

Bytes.toBytes("CREATE_TIME"),

CompareOp.EQUAL,

comp

);

filterList.addFilter(filter);

Scan scan = new Scan();

scan.setFilter(filterList);

ResultScanner rs = table.getScanner(scan);

for (Result r : rs) {

System.out.println("Scan: " + r);

}

table.close();

(3)BinaryComparator

二進制比較器芽突,用得較少试浙,有需要請自行查閱官網:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/BinaryComparator.html

(4)BinaryPrefixComparator

二進制前綴比較器,用得較少寞蚌,有需要請自行查閱官網:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.html

3. 鍵值元數(shù)據(jù)

由于HBase 采用鍵值對保存內部數(shù)據(jù)田巴,鍵值元數(shù)據(jù)過濾器評估一行的鍵(ColumnFamily:Qualifiers)是否存在 , 對應前節(jié)所述值的情況。

3.1. 基于列族過濾數(shù)據(jù)的FamilyFilter

構造函數(shù):

FamilyFilter(CompareFilter.CompareOp familyCompareOp, ByteArrayComparable familyComparator)

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

/**

* FamilyFilter構造函數(shù)中第二個參數(shù)是ByteArrayComparable類型

* ByteArrayComparable類參見“引言-參數(shù)基礎”章節(jié)

* 下面僅以最可能用到的BinaryComparator挟秤、BinaryPrefixComparator舉例:

*/

FamilyFilter ff = new FamilyFilter(

CompareFilter.CompareOp.EQUAL ,

new BinaryComparator(Bytes.toBytes("pat"))? //表中不存在pat列族壹哺,過濾結果為空

);

FamilyFilter ff1 = new FamilyFilter(

CompareFilter.CompareOp.EQUAL ,

new BinaryPrefixComparator(Bytes.toBytes("pat"))? //表中存在以pat打頭的列族patentinfo,過濾結果為該列族所有行

);

Scan scan = new Scan();

scan.setFilter(ff1);

ResultScanner rs = table.getScanner(scan);

注意:

如果希望查找的是一個已知的列族煞聪,則使用 scan.addFamily(family)? 比使用過濾器效率更高斗躏;

由于目前HBase對多列族支持不完善,所以該過濾器目前用途不大昔脯。

3.2. 基于限定符Qualifier(列)過濾數(shù)據(jù)的QualifierFilter

構造函數(shù):

QualifierFilter(CompareFilter.CompareOp op, ByteArrayComparable qualifierComparator)

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

/**

* QualifierFilter構造函數(shù)中第二個參數(shù)是ByteArrayComparable類型

* ByteArrayComparable類有以下子類可以使用:

* *******************************************

* BinaryComparator? 匹配完整字節(jié)數(shù)組,

* BinaryPrefixComparator? 匹配開始的部分字節(jié)數(shù)組,

* BitComparator,

* NullComparator,

* RegexStringComparator,? 正則表達式匹配

* SubstringComparator

* *******************************************

* 下面僅以最可能用到的BinaryComparator啄糙、BinaryPrefixComparator舉例:

*/

QualifierFilter ff = new QualifierFilter(

CompareFilter.CompareOp.EQUAL ,

new BinaryComparator(Bytes.toBytes("belong"))? //表中不存在belong列,過濾結果為空

);

QualifierFilter ff1 = new QualifierFilter(

CompareFilter.CompareOp.EQUAL ,

new BinaryPrefixComparator(Bytes.toBytes("BELONG"))? //表中存在以BELONG打頭的列BELONG_SITE云稚,過濾結果為所有行的該列數(shù)據(jù)

);

Scan scan = new Scan();

scan.setFilter(ff1);

ResultScanner rs = table.getScanner(scan);

說明:

一旦涉及到列(Qualifier)隧饼,HBase就只認大寫字母了!

該過濾器應該比FamilyFilter更常用静陈!

3.3. 基于列名(即Qualifier)前綴過濾數(shù)據(jù)的ColumnPrefixFilter? ( 該功能用QualifierFilter也能實現(xiàn) )

構造函數(shù):

ColumnPrefixFilter(byte[] prefix)

注意:

一個列名是可以出現(xiàn)在多個列族中的燕雁,該過濾器將返回所有列族中匹配的列诞丽。

官網示例代碼,查找所有"abc"打頭的列:

HTableInterface t = ...;

byte[] row = ...;

byte[] family = ...;

byte[] prefix = Bytes.toBytes("abc");

Scan scan = new Scan(row, row); // (optional) limit to one row

scan.addFamily(family); // (optional) limit to one family

Filter f = new ColumnPrefixFilter(prefix);

scan.setFilter(f);

scan.setBatch(10); // set this if there could be many columns returned

ResultScanner rs = t.getScanner(scan);

for (Result r = rs.next(); r != null; r = rs.next()) {

for (KeyValue kv : r.raw()) {

// each kv represents a column

}

}

rs.close();

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

//返回所有行中以BELONG打頭的列的數(shù)據(jù)

ColumnPrefixFilter ff1 = new ColumnPrefixFilter(Bytes.toBytes("BELONG"));

Scan scan = new Scan();

scan.setFilter(ff1);

ResultScanner rs = table.getScanner(scan);

3.4. 基于多個列名(即Qualifier)前綴過濾數(shù)據(jù)的MultipleColumnPrefixFilter

說明:

MultipleColumnPrefixFilter 和 ColumnPrefixFilter 行為差不多拐格,但可以指定多個前綴僧免。

官方示例代碼,查找所有"abc"或"xyz"打頭的列:

HTableInterface t = ...;

byte[] row = ...;

byte[] family = ...;

byte[][] prefixes = new byte[][] {Bytes.toBytes("abc"), Bytes.toBytes("xyz")};

Scan scan = new Scan(row, row); // (optional) limit to one row

scan.addFamily(family); // (optional) limit to one family

Filter f = new MultipleColumnPrefixFilter(prefixes);

scan.setFilter(f);

scan.setBatch(10); // set this if there could be many columns returned

ResultScanner rs = t.getScanner(scan);

for (Result r = rs.next(); r != null; r = rs.next()) {

for (KeyValue kv : r.raw()) {

// each kv represents a column

}

}

rs.close();

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

byte[][] prefixes = new byte[][] {Bytes.toBytes("BELONG"), Bytes.toBytes("CREATE")};

//返回所有行中以BELONG或者CREATE打頭的列的數(shù)據(jù)

MultipleColumnPrefixFilter ff = new MultipleColumnPrefixFilter(prefixes);

Scan scan = new Scan();

scan.setFilter(ff);

ResultScanner rs = table.getScanner(scan);

3.5. 基于列范圍(不是行范圍)過濾數(shù)據(jù)ColumnRangeFilter

說明:

可用于獲得一個范圍的列捏浊,例如懂衩,如果你的一行中有百萬個列,但是你只希望查看列名為bbbb到dddd的范圍

該方法從 HBase 0.92 版本開始引入

一個列名是可以出現(xiàn)在多個列族中的金踪,該過濾器將返回所有列族中匹配的列

構造函數(shù):

ColumnRangeFilter(byte[] minColumn, boolean minColumnInclusive, byte[] maxColumn, boolean maxColumnInclusive)

參數(shù)解釋:

minColumn - 列范圍的最小值浊洞,如果為空,則沒有下限胡岔;

minColumnInclusive - 列范圍是否包含minColumn 法希;

maxColumn - 列范圍最大值,如果為空靶瘸,則沒有上限苫亦;

maxColumnInclusive - 列范圍是否包含maxColumn 。

官網示例代碼奕锌,查找列名在"bbbb"到"dddd"范圍的數(shù)據(jù):

HTableInterface t = ...;

byte[] row = ...;

byte[] family = ...;

byte[] startColumn = Bytes.toBytes("bbbb");

byte[] endColumn = Bytes.toBytes("bbdd");

Scan scan = new Scan(row, row); // (optional) limit to one row

scan.addFamily(family); // (optional) limit to one family

Filter f = new ColumnRangeFilter(startColumn, true, endColumn, true);

scan.setFilter(f);

scan.setBatch(10); // set this if there could be many columns returned

ResultScanner rs = t.getScanner(scan);

for (Result r = rs.next(); r != null; r = rs.next()) {

for (KeyValue kv : r.raw()) {

// each kv represents a column

}

}

rs.close();

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

byte[] startColumn = Bytes.toBytes("C");

byte[] endColumn = Bytes.toBytes("D");

//返回所有列中從C到D打頭的范圍的數(shù)據(jù)著觉,實際返回類似CREATOR村生、CREATE_TIME惊暴、CHANNEL_CODE等列的數(shù)據(jù)

ColumnRangeFilter ff = new ColumnRangeFilter(startColumn, true, endColumn, true);

Scan scan = new Scan();

scan.setFilter(ff);

ResultScanner rs = table.getScanner(scan);

4. RowKey

當需要根據(jù)行鍵特征查找一個范圍的行數(shù)據(jù)時,使用Scan的startRow和stopRow會更高效趁桃,但是辽话,startRow和stopRow只能匹配行鍵的開始字符,而不能匹配中間包含的字符:

byte[] startColumn = Bytes.toBytes("aaa");

byte[] endColumn = Bytes.toBytes("bbb");

Scan scan = new Scan(startColumn,endColumn);

當需要針對行鍵進行更復雜的過濾時卫病,可以使用RowFilter:

構造函數(shù):

RowFilter(CompareFilter.CompareOp rowCompareOp, ByteArrayComparable rowComparator)

參數(shù)解釋參見“引言-參數(shù)基礎”章節(jié)油啤。

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

/**

* rowkey格式為:創(chuàng)建日期_發(fā)布日期_ID_TITLE

* 目標:查找? 發(fā)布日期? 為? 2013-07-16? 的數(shù)據(jù)

*/

RowFilter rf = new RowFilter(

CompareFilter.CompareOp.EQUAL ,

new SubstringComparator("_2013-07-16_")

);

Scan scan = new Scan();

scan.setFilter(rf);

ResultScanner rs = table.getScanner(scan);

注意:

測試過程中嘗試通過組合使用兩個RowFilter(CompareFilter.CompareOp參數(shù)分別為GREATER_OR_EQUAL和LESS_OR_EQUAL),和SubstringComparator蟀苛,過濾找出指定發(fā)布時間范圍內的數(shù)據(jù)益咬,但結果比較意外,不是預想的數(shù)據(jù)帜平,估計比較運算符GREATER_OR_EQUAL和LESS_OR_EQUAL和比較器SubstringComparator組合使用效果不太好幽告,慎用。

5.PageFilter

指定頁面行數(shù)裆甩,返回對應行數(shù)的結果集冗锁。

需要注意的是,該過濾器并不能保證返回的結果行數(shù)小于等于指定的頁面行數(shù)嗤栓,因為過濾器是分別作用到各個region server的冻河,它只能保證當前region返回的結果行數(shù)不超過指定頁面行數(shù)箍邮。

構造函數(shù):

PageFilter(long pageSize)

實測代碼(從“2013-07-26”行開始,取5行):

Scan scan = new Scan();

scan.setStartRow(Bytes.toBytes("2013-07-26"));

PageFilter pf = new PageFilter(5L);

scan.setFilter(pf);

ResultScanner rs = table.getScanner(scan);

for (Result r : rs) {

for (Cell cell : r.rawCells()) {

System.out.println("Rowkey : " + Bytes.toString(r.getRow())

+ "? Familiy:Quilifier : "

+ Bytes.toString(CellUtil.cloneQualifier(cell))

+ "? Value : "

+ Bytes.toString(CellUtil.cloneValue(cell))

+ "? Time : " + cell.getTimestamp());

}

}

注意:

由于該過濾器并不能保證返回的結果行數(shù)小于等于指定的頁面行數(shù)叨叙,所以更好的返回指定行數(shù)的辦法是ResultScanner.next(int nbRows) 锭弊,即:

ResultScanner rs = table.getScanner(scan);

for (Result r : rs.next(5)) {

for (Cell cell : r.rawCells()) {

System.out.println("Rowkey : " + Bytes.toString(r.getRow())

+ "? Familiy:Quilifier : "

+ Bytes.toString(CellUtil.cloneQualifier(cell))

+ "? Value : "

+ Bytes.toString(CellUtil.cloneValue(cell))

+ "? Time : " + cell.getTimestamp());

}

}

6.SkipFilter

根據(jù)整行中的每個列來做過濾,只要存在一列不滿足條件擂错,整行都被過濾掉廷蓉。

例如,如果一行中的所有列代表的是不同物品的重量马昙,則真實場景下這些數(shù)值都必須大于零桃犬,我們希望將那些包含任意列值為0的行都過濾掉。

在這個情況下行楞,我們結合ValueFilter和SkipFilter共同實現(xiàn)該目的:

scan.setFilter(new SkipFilter(new ValueFilter(CompareOp.NOT_EQUAL,new BinaryComparator(Bytes.toBytes(0))));

構造函數(shù):

SkipFilter(Filter filter)

個人實測代碼:

目前的數(shù)據(jù):

hbase(main):009:0> scan 'rd_ns:itable'

ROW? ? ? ? ? ? ? ? ? ? ? ? COLUMN+CELL

100001? ? ? ? ? ? ? ? ? ? column=info:address, timestamp=1405417403438, value=anywhere

100001? ? ? ? ? ? ? ? ? ? column=info:age, timestamp=1405417403438, value=24

100001? ? ? ? ? ? ? ? ? ? column=info:name, timestamp=1405417403438, value=zhangtao

100002? ? ? ? ? ? ? ? ? ? column=info:address, timestamp=1405417426693, value=shangdi

100002? ? ? ? ? ? ? ? ? ? column=info:age, timestamp=1405417426693, value=28

100002? ? ? ? ? ? ? ? ? ? column=info:name, timestamp=1405417426693, value=shichao

100003? ? ? ? ? ? ? ? ? ? column=info:address, timestamp=1405494141522, value=huilongguan

100003? ? ? ? ? ? ? ? ? ? column=info:age, timestamp=1405494999631, value=29

100003? ? ? ? ? ? ? ? ? ? column=info:name, timestamp=1405494141522, value=liyang

3 row(s) in 0.0190 seconds

執(zhí)行以下代碼:

Configuration conf = HBaseConfiguration.create();

HTable table = new HTable(conf, "rd_ns:itable");

Scan scan = new Scan();

scan.setFilter(new SkipFilter(new ValueFilter(CompareOp.NOT_EQUAL,

new BinaryComparator(Bytes.toBytes("28")))));

ResultScanner rs = table.getScanner(scan);

for (Result r : rs) {

for (Cell cell : r.rawCells()) {

System.out.println("Rowkey : " + Bytes.toString(r.getRow())

+ "? Familiy:Quilifier : "

+ Bytes.toString(CellUtil.cloneQualifier(cell))

+ "? Value : "

+ Bytes.toString(CellUtil.cloneValue(cell))

+ "? Time : " + cell.getTimestamp());

}

}

table.close();

輸出結果(整個100002行被過濾掉了):

Rowkey : 100001? Familiy:Quilifier : address? Value : anywhere? Time : 1405417403438

Rowkey : 100001? Familiy:Quilifier : age? Value : 24? Time : 1405417403438

Rowkey : 100001? Familiy:Quilifier : name? Value : zhangtao? Time : 1405417403438

Rowkey : 100003? Familiy:Quilifier : address? Value : huilongguan? Time : 1405494141522

Rowkey : 100003? Familiy:Quilifier : age? Value : 29? Time : 1405494999631

Rowkey : 100003? Familiy:Quilifier : name? Value : liyang? Time : 1405494141522

7. Utility--FirstKeyOnlyFilter

該過濾器僅僅返回每一行中的第一個cell的值攒暇,可以用于高效的執(zhí)行行數(shù)統(tǒng)計操作。

估計實戰(zhàn)意義不大子房。

構造函數(shù):

public FirstKeyOnlyFilter()

個人實測代碼:

HTable table = HBaseDAO.getHTable("147patents");

FirstKeyOnlyFilter fkof = new FirstKeyOnlyFilter();

Scan scan = new Scan();

scan.setFilter(fkof);

ResultScanner rs = table.getScanner(scan);

8. 取得查詢結果

無論是官網的Ref Guide還是網上流傳的大部分博客中形用,輸出查詢結果的代碼都是:

for (Result r = rs.next(); r != null; r = rs.next()) {

for (KeyValue kv : r.raw()) {

// each kv represents a column

}

}

但查看最新的API可知Result實例的raw()方法已經不建議使用了:

raw() Deprecated. as of 0.96, use rawCells()

0.96以后版本正確的獲取結果代碼如下:

for (Result r : rs) {

for (Cell cell : r.rawCells()) {

System.out.println(

"Rowkey : "+Bytes.toString(r.getRow())+

"Familiy:Quilifier : "+Bytes.toString(CellUtil.cloneQualifier(cell))+

"Value : "+Bytes.toString(CellUtil.cloneValue(cell))

);

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市证杭,隨后出現(xiàn)的幾起案子田度,更是在濱河造成了極大的恐慌,老刑警劉巖解愤,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镇饺,死亡現(xiàn)場離奇詭異,居然都是意外死亡送讲,警方通過查閱死者的電腦和手機奸笤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哼鬓,“玉大人监右,你說我怎么就攤上這事∫煜#” “怎么了健盒?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長称簿。 經常有香客問我扣癣,道長,這世上最難降的妖魔是什么予跌? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任搏色,我火速辦了婚禮,結果婚禮上券册,老公的妹妹穿的比我還像新娘频轿。我一直安慰自己垂涯,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布航邢。 她就那樣靜靜地躺著耕赘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膳殷。 梳的紋絲不亂的頭發(fā)上操骡,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音赚窃,去河邊找鬼册招。 笑死,一個胖子當著我的面吹牛勒极,可吹牛的內容都是我干的是掰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辱匿,長吁一口氣:“原來是場噩夢啊……” “哼键痛!你這毒婦竟也來了?” 一聲冷哼從身側響起匾七,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤絮短,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昨忆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丁频,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年扔嵌,在試婚紗的時候發(fā)現(xiàn)自己被綠了限府。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夺颤。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痢缎,死狀恐怖,靈堂內的尸體忽然破棺而出世澜,到底是詐尸還是另有隱情独旷,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布寥裂,位于F島的核電站嵌洼,受9級特大地震影響,放射性物質發(fā)生泄漏封恰。R本人自食惡果不足惜麻养,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诺舔。 院中可真熱鬧鳖昌,春花似錦备畦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糕档,卻和暖如春莉恼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背速那。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工俐银, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人端仰。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓悉患,卻偏偏與公主長得像,于是被迫代替她去往敵國和親榆俺。 傳聞我的和親對象是個殘疾皇子售躁,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • http://blog.csdn.net/fengzheku/article/details/48447791 p...
    木子Qing閱讀 2,531評論 1 1
  • 通過Java 操作Hbase 一、版本: hbase: 二茴晋、操作Hbase: 1陪捷、首先定義幾個用的到的全局變量: ...
    利伊奧克兒閱讀 1,642評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)诺擅,斷路器市袖,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法烁涌,內部類的語法苍碟,繼承相關的語法,異常的語法撮执,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 以往的生日微峰,都沒有寫,我想往后的每個生日抒钱,都記錄些什么來蜓肆。 小學傻傻留級一年畢業(yè),初中不得已轉學回家升高中,高中后...
    柔軟的時候閱讀 216評論 0 0