spark保存数据到hbase_使用spark将数据写入Hbase

--------------组装xml并捕获异常-------------------

package wondersgroup_0628.com

import java.io.{IOException, PrintWriter, StringReader, StringWriter}

import java.util.Base64

import com.wonders.TXmltmp

import org.apache.hadoop.hbase.HBaseConfiguration

import org.apache.hadoop.hbase.client.{HTable, Put}

import org.apache.hadoop.hbase.mapred.TableInputFormat

import org.apache.hadoop.hbase.util.Bytes

import org.apache.spark.{SparkConf, SparkContext}

import org.xml.sax.{InputSource, SAXException}

object TestTest_3 {

def main(args: Array[String]): Unit = {

val saprkConf = new SparkConf().setAppName("TextTeset_3")

val sc = new SparkContext(saprkConf)

// val dataText = "/user/hdfs/test/rdd_1000000.dat"

val rdd = sc.textFile(args(0))

val data = rdd.map(_.split("\\|\\|")).map{x=>(x(0),x(1),x(2))}

val result = data.foreachPartition{x => {

val conf= HBaseConfiguration.create()

conf.set(TableInputFormat.COLUMN_LIST,"hbaseTest");

conf.set("hbase.zookeeper.quorum","qsmaster,qsslave1,qsslave2");

conf.set("hbase.zookeeper.property.clientPort","2181");

// conf.addResource("/home/hadoop/data/lib/hbase-site.xml");

val table = new HTable(conf,"hbaseTest");

table.setAutoFlush(false,false);

table.setWriteBufferSize(5*1024*1024);

x.foreach{y => {

try {

val tmp = new TXmltmp

val j1 = new String( Base64.getDecoder.decode(y ._1) )

val j2 = new String( Base64.getDecoder.decode(y ._2))

val xml = tmp.load(j1, j2)

import javax.xml.parsers.DocumentBuilderFactory

val foctory = DocumentBuilderFactory.newInstance

val builder = foctory.newDocumentBuilder

val buil = builder.parse(new InputSource( new StringReader(xml)))

var put= new Put(Bytes.toBytes(y._3));

put.addColumn(Bytes.toBytes("cf2"), Bytes.toBytes("age"), Bytes.toBytes(xml))

table.put(put);table.flushCommits

}

catch {

case ex: SAXException=>

case ex: IOException=>

println("found a unknown exception"+ ex)

val sw:StringWriter = new StringWriter()

val pw:PrintWriter = new PrintWriter(sw)

ex.printStackTrace(pw)

val error = sw.getBuffer

sw.close()

pw.close()

var put= new Put(Bytes.toBytes(y._3));

put.addColumn(Bytes.toBytes("cf2"), Bytes.toBytes("name"), Bytes.toBytes(error.toString))

table.put(put);table.flushCommits}

}}

}}

sc.stop()}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark可以通过HiveContext来读取Hive数据,然后通过HBase API将数据写入HBase。具体步骤如下: 1. 创建SparkConf和SparkContext对象。 2. 创建HiveContext对象,通过HiveContext对象读取Hive数据。 3. 将Hive数据转换为RDD。 4. 创建HBaseConfiguration对象,设置HBase相关配置。 5. 创建HBase表,如果表已经存在,则不需要创建。 6. 将RDD中的数据写入HBase表中。 示例代码如下: ``` import org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{ConnectionFactory, Put} import org.apache.hadoop.hbase.util.Bytes import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.hive.HiveContext object SparkHiveToHBase { def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setAppName("SparkHiveToHBase") val sc = new SparkContext(sparkConf) val hiveContext = new HiveContext(sc) // 读取Hive数据 val df = hiveContext.sql("SELECT * FROM my_table") // 将DataFrame转换为RDD val rdd = df.rdd // 创建HBaseConfiguration对象 val hbaseConf = HBaseConfiguration.create() // 设置HBase相关配置 hbaseConf.set("hbase.zookeeper.quorum", "localhost") hbaseConf.set("hbase.zookeeper.property.clientPort", "2181") // 创建HBase表 val tableName = TableName.valueOf("my_table") val connection = ConnectionFactory.createConnection(hbaseConf) val admin = connection.getAdmin if (!admin.tableExists(tableName)) { val tableDesc = new HTableDescriptor(tableName) tableDesc.addFamily(new HColumnDescriptor("cf".getBytes)) admin.createTable(tableDesc) } // 将RDD中的数据写入HBase表中 rdd.foreachPartition(partition => { val connection = ConnectionFactory.createConnection(hbaseConf) val table = connection.getTable(tableName) partition.foreach(row => { val put = new Put(Bytes.toBytes(row.getString())) put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col1"), Bytes.toBytes(row.getString(1))) put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col2"), Bytes.toBytes(row.getString(2))) table.put(put) }) table.close() connection.close() }) sc.stop() } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值