【问题标题】:Spark Hbase connector (SHC) is not returning any data from HBase tableSpark Hbase 连接器 (SHC) 未从 HBase 表返回任何数据
【发布时间】:2026-02-20 18:50:01
【问题描述】:

我正在关注 spark hbase 连接器基本示例,以在 spark2 shell 版本 2.2.0 中读取 HBase 表。看起来代码正在运行,但是当我运行 df.show() 命令时,我没有看到任何结果,而且它似乎一直在运行。

import org.apache.spark.sql.{ DataFrame, Row, SQLContext }
import org.apache.spark.sql.execution.datasources.hbase._

val sqlContext = new org.apache.spark.sql.SQLContext(sc); 

def catalog = s"""{
         |"table":{"namespace":"default", "name":"testmeta"},
         |"rowkey":"vgil",
         |"columns":{
            |"id":{"cf":"rowkey", "col":"vgil", "type":"string"},
           |"col1":{"cf":"pp", "col":"dtyp", "type":"string"}
         |}
       |}""".stripMargin


def withCatalog(cat: String): DataFrame = { sqlContext.read.options(Map(HBaseTableCatalog.tableCatalog->cat)).format("org.apache.spark.sql.execution.datasources.hbase").load()}

val df = withCatalog(catalog)

df.show()

df.show() 既不会给出任何输出,也不会给出任何错误。它会一直运行下去。

另外,如何对行键范围运行查询。

这里是 HBase 测试表的扫描。

hbase(main):001:0> scan 'testmeta'
ROW                                 COLUMN+CELL                                                                                            
 fmix                            column=pp:dtyp, timestamp=1541714925380, value=ss1                                                     
 fmix                            column=pp:lati, timestamp=1541714925371, value=41.50                                                   
 fmix                            column=pp:long, timestamp=1541714925374, value=-81.61                                                  
 fmix                            column=pp:modm, timestamp=1541714925377, value=ABC                                                                                                   
 vgil                            column=pp:dtyp, timestamp=1541714925405, value=ss2                                                     
 vgil                            column=pp:lati, timestamp=1541714925397, value=41.50                                                   

我在网上关注了一些解决方案,但遗憾的是无法从 HBase 获取数据。

提前感谢您的帮助!

【问题讨论】:

    标签: scala apache-spark hbase


    【解决方案1】:

    经过大量试验后发布我的答案,所以我发现添加 --conf 选项来启动 spark shell 帮助我连接到 HBase。

    spark2-shell --master yarn --deploy-mode client --packages com.hortonworks:shc-core:1.1.1-2.1-s_2.11,it.nerdammer.bigdata:spark-hbase-connector_2.10:1.0.3 --repositories http://repo.hortonworks.com/content/groups/public/ --conf spark.hbase.host=192.168.xxx.xxx --files /mnt/fs1/opt/cloudera/parcels/CDH-5.13.0-1.cdh5.13.0.p0.29/share/doc/hbase-solr-doc-1.5+cdh5.13.0+71/demo/hbase-site.xml
    

    那么下面的代码 sn-p 可以获取一个列限定符的值。

    val hBaseRDD_iacp = sc.hbaseTable[(String)]("testmeta").select("lati").inColumnFamily("pp").withStartRow("vg").withStopRow("vgz")      
    object myschema {
          val column1 = StructField("column1",  StringType)
          val struct = StructType(Array(column1))
        }
    
    
    val rowRDD = hBaseRDD.map(x => Row(x))
    val myDf = sqlContext.createDataFrame(rowRDD,myschema.struct)  
    myDf.show()
    

    【讨论】: