使用 Spark 读取带有 where 子句的 HBase 表

Posted

技术标签:

【中文标题】使用 Spark 读取带有 where 子句的 HBase 表【英文标题】:Read HBase table with where clause using Spark 【发布时间】:2016-10-17 08:56:25 【问题描述】:

我正在尝试使用 Spark Scala API 读取 HBase 表。

示例代码:

conf.set("hbase.master", "localhost:60000")
conf.set("hbase.zookeeper.quorum", "localhost")
conf.set(TableInputFormat.INPUT_TABLE, tableName)
val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[ImmutableBytesWritable], classOf[Result])
println("Number of Records found : " + hBaseRDD.count())

如果我使用newAPIHadoopRDD,如何添加where 子句?

或者我们需要使用任何Spark Hbase Connector 来实现这一点?

我看到了下面的 Spark Hbase 连接器,但我没有看到任何带有 where 子句的示例代码。

https://github.com/nerdammer/spark-hbase-connector

【问题讨论】:

【参考方案1】:

您可以使用 HortonWorks 的 SHC 连接器来实​​现此目的。

https://github.com/hortonworks-spark/shc

这是 Spark 2 的代码示例。

 val catalog =
        s"""
            |"table":"namespace":"default", "name":"my_table",
            |"rowkey":"id",
            |"columns":
            |"id":"cf":"rowkey", "col":"id", "type":"string",
            |"name":"cf":"info", "col":"name", "type":"string",
            |"age":"cf":"info", "col":"age", "type":"string"
            |
            |""".stripMargin

    val spark = SparkSession
        .builder()
        .appName("hbase spark")
        .getOrCreate()

    val df = spark
        .read
        .options(
            Map(
                HBaseTableCatalog.tableCatalog -> catalog
            )
        )
        .format("org.apache.spark.sql.execution.datasources.hbase")
        .load()

    df.show()

然后,您可以在数据框上使用任何方法。例如:

df.where(df("age") === 20)

【讨论】:

我试了一下,其他字段输出正常,但是cf:rowkey没有输出到目标表,这是SHC的属性吗?

以上是关于使用 Spark 读取带有 where 子句的 HBase 表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL - 带有 Where 子句的插入语句

在 spark 数据框中使用 where 子句加载数据

Spark Cassandra 连接器 - where 子句

使用 Spark 执行“WHERE IN”子句,如何仅重新训练第一个数据集的列?

哪个更快? Spark SQL with Where 子句或在 Spark SQL 之后在 Dataframe 中使用过滤器

Spark SQL 中的 where 子句与 join 子句