分享

疑惑:Spark 从Hbase中读取数据显示错误

问题描述: 我用scala语言写了一个读取hbase中的表,并将数据打印出来的操作,但是从显示结果看,只有id字段值正确,其余的字段显示都有问题,但感觉代码没有什么问题,特贴出来,让大家看看有没有问题。
代码:
object Hbase2Rdd {
  def main(args: Array[String]): Unit = {

    val Array(master) = args

    val sparkConf = new SparkConf().setAppName("Hbase2Rdd").setMaster(master)
    val sc = new SparkContext(sparkConf)
    val sqlContext = new SQLContext(sc)

  val conf = HBaseConfiguration.create()
    conf.set("hbase.zookeeper.property.clientPort", "2181")
    conf.set("hbase.zookeeper.quorum", "192.168.xxx.xxx")
    conf.set("hbase.master", "192.168.xxx.xxx:60000")

    val scan = new Scan
    val tableName = "orders"
conf.set(TableInputFormat.INPUT_TABLE, tableName)

   /* val proto = ProtobufUtil.toScan(scan)
    val ScanToString = Base64.encodeBytes(proto.toByteArray)
    conf.set(TableInputFormat.SCAN, ScanToString)*/
    //读取数据并转化成rdd
val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
      classOf[ImmutableBytesWritable],
      classOf[Result])

    val count = hBaseRDD.count()
    println("counts : " + count)

    //hBaseRDD.saveAsTextFile(path)
import sqlContext.implicits._
    val order = hBaseRDD.map(recode => (
      //通过列族和列名获取列
Bytes.toString(recode._2.getValue(Bytes.toBytes("cf"), Bytes.toBytes("orderId"))),
      Bytes.toInt(recode._2.getValue(Bytes.toBytes("cf"), Bytes.toBytes("createTime"))),
      Bytes.toInt(recode._2.getValue(Bytes.toBytes("cf"), Bytes.toBytes("modifiedtime"))),
      Bytes.toInt(recode._2.getValue(Bytes.toBytes("cf"), Bytes.toBytes("status")))
    )).toDF("orderId", "createTime", "modifiedtime", "status")

    order.registerTempTable("orderssss")

    val frame = sqlContext.sql("select orderId,createTime,modifiedtime,status from orderssss")
    frame.show()

    sc.stop()
  }
}

结果打印

结果打印

hbase中数据

hbase中数据

请问大家这是什么原因导致打印数据信息与hbase中的不一致呢


已有(3)人评论

跳转到指定楼层
yuwenge 发表于 2017-11-24 15:35:38
尝试下面修改:防止引用错误造成问题
val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
      classOf[ImmutableBytesWritable],
      classOf[Result])
上面替换为:
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],  
classOf[org.apache.hadoop.hbase.client.Result]

回复

使用道具 举报

xiaobaiyang 发表于 2017-11-26 10:18:30
yuwenge 发表于 2017-11-24 15:35
尝试下面修改:防止引用错误造成问题
val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat ...

你好,我试了下,还是不行,和之前的情况一样,我从网上查了,跟我的写法差不多,
回复

使用道具 举报

xuanxufeng 发表于 2017-11-26 11:25:29
本帖最后由 xuanxufeng 于 2017-11-26 11:27 编辑
xiaobaiyang 发表于 2017-11-26 10:18
你好,我试了下,还是不行,和之前的情况一样,我从网上查了,跟我的写法差不多,

]采用下面方式输出,不用show函数
frame.map(x => x(0) + " " + x(1)).collect().foreach(println)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条