Hbase - 表導(dǎo)出CSV數(shù)據(jù)

> 新鮮文章,昨天剛經(jīng)過線上驗(yàn)證過的,使用它導(dǎo)出了3億的用戶數(shù)據(jù)出來,花了半個(gè)小時(shí),性能還是穩(wěn)穩(wěn)的,好了不吹牛皮了,直接上代碼吧。

## MR

考查了Hbase的各種MR,沒有發(fā)現(xiàn)哪一個(gè)是能實(shí)現(xiàn)的,如果有請(qǐng)通知我,我給他發(fā)紅包。

所以我們只能自己來寫一個(gè)MR了,編寫一個(gè)Hbase的MR,官方文檔上也有相應(yīng)的例子。

我們用來加以化妝就得到我們想要的了。

導(dǎo)出的CSV格式為

```

admin,22,北京

admin,23,天津

```

依賴 [hbase-mapreduce](https://mvnrepository.com/artifact/org.apache.hbase/hbase-mapreduce)

## 擼scala代碼了

定義Map轉(zhuǎn)換類

```

class MyMapper extends TableMapper[Text, Text] {

? val keyText = new Text()

? val valueText = new Text()

? override def map(key: ImmutableBytesWritable, value: Result, context: Mapper[ImmutableBytesWritable, Result, Text, Text]#Context): Unit = {

? ? val maps = result2Map(value)

? ? keyText.set(maps.get("userId"))

? ? valueText.set(s"${maps.get("regTime")}")

? ? context.write(keyText, valueText)

? }

? //將Result轉(zhuǎn)換為Map

? def result2Map(result: Result): util.HashMap[lang.String, lang.String] = {

? ? val map = new util.HashMap[lang.String, lang.String]()

? ? result.rawCells().foreach {

? ? ? cell =>

? ? ? ? val column: Array[Byte] = CellUtil.cloneQualifier(cell)

? ? ? ? val value: Array[Byte] = CellUtil.cloneValue(cell)

? ? ? ? val qualifierByte = cell.getQualifierArray

? ? ? ? if (qualifierByte != null && qualifierByte.nonEmpty) {

? ? ? ? ? if (value == null || value.length == 0) {

? ? ? ? ? ? map.put(Bytes.toString(column), "")

? ? ? ? ? } else {

? ? ? ? ? ? map.put(Bytes.toString(column), Bytes.toString(value))

? ? ? ? ? }

? ? ? ? }

? ? }

? ? map

? }

}

```

定義Reducer類

```

class MyReducer extends Reducer[Text, Text, Text, Text] {

? override def reduce(key: Text, values: lang.Iterable[Text], context: Reducer[Text, Text, Text, Text]#Context): Unit = {

? ? val iter = values.iterator()

? ? while (iter.hasNext) {

? ? //這樣可以只保留下Key字段,也就只有一行數(shù)據(jù)了

? ? ? val tmpText = iter.next()

? ? ? val mergeKey = new Text()

? ? ? mergeKey.set(key.toString + "," + tmpText.toString)

? ? ? val v = new Text()

? ? ? v.set("")

? ? ? context.write(mergeKey, v)

? ? }

? }

}

```

ExportCsv核心

```

class ExportCsv extends Configured with Tool {

? override def run(args: Array[String]): Int = {

? ? val conf = HBaseConfiguration.create()

? ? conf.addResource(new FileInputStream(new File("/etc/hbase/conf/hbase-site.xml")))

? ? conf.set(org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.OUTDIR, "/tmp/hbasecsv")

? ? conf.set("mapreduce.job.running.map.limit", "8") //最多有多少個(gè)Task同時(shí)跑

? ? val job = Job.getInstance(conf, "HbaseExportCsv")

? ? job.setJarByClass(classOf[ExportCsv])

? ? val scan = new Scan()

? ? //過濾我們想要的數(shù)據(jù)

? ? scan.addFamily(Bytes.toBytes("ext"))

? ? scan.addColumn(Bytes.toBytes("ext"), Bytes.toBytes("userId"))

? ? scan.addColumn(Bytes.toBytes("ext"), Bytes.toBytes("regTime"))

? ? scan.setBatch(1000)

? ? scan.setCacheBlocks(false)

? ? TableMapReduceUtil.initTableMapperJob(

? ? ? "USER_TABLE",

? ? ? scan,

? ? ? classOf[MyMapper],

? ? ? classOf[Text],

? ? ? classOf[Text],

? ? ? job

? ? )

? ? job.setReducerClass(classOf[MyReducer])

? ? val jobConf = new JobConf(job.getConfiguration)

? ? FileOutputFormat.setOutputPath(jobConf, new Path("/tmp/hbasecsv"))

? ? val isDone = job.waitForCompletion(true)

? ? if (isDone) 0 else 1

? }

}

```

要跑了任務(wù)了

```

hadoop jar ExportCsv.jar

```

---

![](https://upload-images.jianshu.io/upload_images/9028759-07315bb8dadcd082.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 新鮮文章,昨天剛經(jīng)過線上驗(yàn)證過的,使用它導(dǎo)出了3億的用戶數(shù)據(jù)出來,花了半個(gè)小時(shí),性能還是穩(wěn)穩(wěn)的,好了不吹牛皮了,直...
    kikiki2閱讀 155評(píng)論 0 2
  • 新鮮文章,昨天剛經(jīng)過線上驗(yàn)證過的,使用它導(dǎo)出了3億的用戶數(shù)據(jù)出來,花了半個(gè)小時(shí),性能還是穩(wěn)穩(wěn)的,好了不吹牛皮了,直...
    kikiki1閱讀 172評(píng)論 0 3
  • 新鮮文章,昨天剛經(jīng)過線上驗(yàn)證過的,使用它導(dǎo)出了3億的用戶數(shù)據(jù)出來,花了半個(gè)小時(shí),性能還是穩(wěn)穩(wěn)的,好了不吹牛皮了,直...
    kikiki1閱讀 90評(píng)論 0 2
  • 新鮮文章,昨天剛經(jīng)過線上驗(yàn)證過的,使用它導(dǎo)出了3億的用戶數(shù)據(jù)出來,花了半個(gè)小時(shí),性能還是穩(wěn)穩(wěn)的,好了不吹牛皮了,直...
    大豬大豬閱讀 182評(píng)論 0 1
  • 一、環(huán)境準(zhǔn)備 請(qǐng)參考:ELK環(huán)境準(zhǔn)備 二、安裝kibana 2.1 下載安裝 下載地址 2.2 安裝配置 vim ...
    57山本無憂閱讀 366評(píng)論 0 0

友情鏈接更多精彩內(nèi)容