分享

还是关于hbase

本帖最后由 remarkzhao 于 2017-9-4 16:28 编辑

各位大神:
从sqlserver里拉过来的dataframe  写入hbase

代码如果下:  见图片   

问题:
       1.代码插入时同个rowkey,同个列族同个列,新的值会不会覆盖掉旧值? 我同个rowkey,一般有4-5条数据,这4,5条数据可能相同

        现在插完之后只能看到一个rowkey的一个列族一个列只有一个值  查询语句:scan 'JianYanJieGuo',{FILTER => "PrefixFilter ('10_02078247_020160920062153')",RAW => true, VERSIONS => 10}  
        2.如果在hbase shell情况下用put命令 可以查到put插入的数据。
       PS: 我建表setMaxVersions(10)
1.png
2.png

已有(16)人评论

跳转到指定楼层
langke93 发表于 2017-9-4 17:40:39
代码插入时同个rowkey,同个列族同个列,新的值会不会覆盖掉旧值?  只要rowkey相同,会覆盖掉旧值的.如果设置了版本,在版本中可以查看不同的版本值,但是查询显示只会显示最新值
回复

使用道具 举报

remarkzhao 发表于 2017-9-4 17:41:55
langke93 发表于 2017-9-4 17:40
代码插入时同个rowkey,同个列族同个列,新的值会不会覆盖掉旧值?  只要rowkey相同,会覆盖掉旧值的.如果 ...

设置过了版本了。但是用 这个命令 get 'JianYanJieGuo','123',{COLUMN=>'JieGuo:WenShu',VERSIONS=>10}    还是只看到一条 信息。
回复

使用道具 举报

remarkzhao 发表于 2017-9-4 17:52:32
还有大神嘛??望指点。。
回复

使用道具 举报

yuwenge 发表于 2017-9-4 18:02:51
remarkzhao 发表于 2017-9-4 17:52
还有大神嘛??望指点。。

说的不够详细,因为不知道你的是否按照格式来操作的。这里给你举个例子
put 't1','rowkey1','f1:name','xx1'  
put 't1','rowkey1','f1:name','xx2'  
如果是普通查询
get 't1','rowkey1','f1:name'  
查询结果为xx2
如果下面查询为
get 't1','rowkey1',{COLUMN=>'f1:name',VERSIONS=>2}  
COLUMN                             CELL                                                                                                
f1:name                           timestamp=1482820567560, value=xx2
f1:name                           timestamp=1482820541363, value=xx1
楼主可对比,如果说是按照上面操作的,可是还是显示的为一条。
第一查看下是否操作失误
第二说下自己的版本号。
第三自己实际操作,并截图。让大家看下。


回复

使用道具 举报

remarkzhao 发表于 2017-9-4 18:09:38
yuwenge 发表于 2017-9-4 18:02
说的不够详细,因为不知道你的是否按照格式来操作的。这里给你举个例子
put 't1','rowkey1','f1:name',' ...

来了。刚才double check过了。
查询命令没问题。
get 'JianYanJieGuo','123',{COLUMN=>'JieGuo:WenShu',VERSIONS=>3}  

插入是我是用scala进行,而不是在hbase shell情况下插入

在hbase shell情况下进行put就没问题 可以查询的到


7.png
回复

使用道具 举报

yuwenge 发表于 2017-9-4 18:14:02
remarkzhao 发表于 2017-9-4 18:09
来了。刚才double check过了。
查询命令没问题。
get 'JianYanJieGuo','123',{COLUMN=>'JieGuo:WenShu' ...

shell跟代码是一样的。证明这样是没有问题的.跟踪下自己的代码。或则自己粗心,导致rowkey不一样。而非覆盖了。
回复

使用道具 举报

remarkzhao 发表于 2017-9-4 19:22:29
yuwenge 发表于 2017-9-4 18:14
shell跟代码是一样的。证明这样是没有问题的.跟踪下自己的代码。或则自己粗心,导致rowkey不一样。而非覆 ...

def loadData1(dbDF:DataFrame,tablename:String,family:String,col:String)={
  val readFile = dbDF.rdd.map{ x =>Array(x(3),x(45))}
readFile.foreachPartition{
  x=> {
    val myConf = HBaseConfiguration.create()
    myConf.set("hbase.zookeeper.quorum", "hadoop001,hadoop002,hadoop003")
    myConf.set("hbase.zookeeper.property.clientPort", "2181")
    myConf.set("hbase.defaults.for.version.skip", "true")
    val myTable = new HTable(myConf, TableName.valueOf(tablename))
    myTable.setAutoFlush(false, false)//关键点1
    myTable.setWriteBufferSize(3*1024*1024)//关键点2
    x.foreach { y => {
      if(y(0).toString == "123") {
        println(y(0) + ":::" + y(1))
      }

      val p = new Put(Bytes.toBytes(y(0).toString))
      p.add(family.getBytes, col.getBytes, Bytes.toBytes(y(1).toString))
      myTable.put(p)
    }
    }
    myTable.flushCommits()//关键点3




def loadData(dbDF:DataFrame,tablename:String,jobConf: JobConf,family:String,col:String)={
  jobConf.set(TableOutputFormat.OUTPUT_TABLE, tablename)
  jobConf.setOutputFormat(classOf[TableOutputFormat])
  val readFile = dbDF.rdd.map{ x =>Array(x(3),x(45))}
  readFile.map(x => {
    var put = new Put(x(0).toString.getBytes())
    put.addColumn(Bytes.toBytes(family), Bytes.toBytes(col), Bytes.toBytes(x(1).toString))
    (new ImmutableBytesWritable, put)
  }).saveAsHadoopDataset(jobConf)

}

这两种都试过了 还是一样结果。。真愁人。。





回复

使用道具 举报

remarkzhao 发表于 2017-9-4 19:24:02
  def createHTable(tablename: String,family: String,jobConf: JobConf): Unit={

    val conn = ConnectionFactory.createConnection(jobConf)
    try {
      val admin = conn.getAdmin
      val tableName = TableName.valueOf(tablename)
      if (!admin.tableExists(tableName)) {
        print("Table Not Exists! Create Table")
        val tableDesc = new HTableDescriptor(tableName)
        val hColumnDescriptor = new HColumnDescriptor(family.getBytes())
        hColumnDescriptor.setMaxVersions(100)
        tableDesc.addFamily(hColumnDescriptor)
        admin.createTable(tableDesc)
        print("New Table Created Successfully!")
      } else {
        print("Table  Exists!  Drop the Table and Create!")
        val tableDesc = new HTableDescriptor(tableName)
        admin.disableTable(tableName)
        admin.deleteTable(tableName)
        tableDesc.addFamily(new HColumnDescriptor(family.getBytes()).setMaxVersions(100))
        admin.createTable(tableDesc)
        print("New Table Created!")

      }
    }finally {
      conn.close()
    }
  }   这个是建表。
回复

使用道具 举报

remarkzhao 发表于 2017-9-4 19:28:50
yuwenge 发表于 2017-9-4 18:14
shell跟代码是一样的。证明这样是没有问题的.跟踪下自己的代码。或则自己粗心,导致rowkey不一样。而非覆 ...

忘了说了 我hbase版本是1.1.11    hadoop是2.6.1
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条