mysql

使用Phoenix操作NoSQL数据库-HBase

2020-09-12  本文已影响0人  多彩海洋

背景

在使用hbase的过程中,使用jdbc原生api方式连接hbase的代码写的很难受,而且维护二级索引也不方便,所以使用了hbase的皮肤--phoenix.

在phoenix中,新增和修改使用同一种sql语法实现

upsert into us_population values('NY','NewYork',8143197);--如果不存在insert,存在则update

phoenix和hbase表之间的映射

默认情况下,直接在hbase中创建的表,通过phoenix是查看不到的。比如kylin相关表是在hbase中直接创建的,在phoenix中是查看不到kylin等表的。

在hbase建表
create 'test',{NAME=>'info1'},{NAME=>'info2'}

在phoenix中使用create table 建立映射
create table "test"(
id varchar primary key,
"info1"."firstname" varchar,
"info1"."lastname" varchar,
"info2"."company" varchar,
"info2"."address" varchar);

spark读写hbase(使用phoenix方式)代码果然清爽了许多:)

object SparkHBaseDataFrame {
  def main(args: Array[String]) {
    // 屏蔽不必要的日志显示在终端上
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)

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

    val url = s"jdbc:phoenix:localhost:2181"
    val dbtable = "PHOENIXTEST"

    //spark 读取 phoenix 返回 DataFrame 的 第一种方式
    val rdf = spark.read
      .format("jdbc")
      .option("driver", "org.apache.phoenix.jdbc.PhoenixDriver")
      .option("url", url)
      .option("dbtable", dbtable)
      .load()
    rdf.printSchema()

    //spark 读取 phoenix 返回 DataFrame 的 第二种方式
    val df = spark.read
      .format("org.apache.phoenix.spark")
      .options(Map("table" -> dbtable, "zkUrl" -> url))
      .load()
    df.printSchema()

    //spark DataFrame 写入 phoenix,需要先建好表
    df.write
      .format("org.apache.phoenix.spark")
      .mode(SaveMode.Overwrite)
      .options(Map("table" -> "PHOENIXTESTCOPY", "zkUrl" -> url))
      .save()

    spark.stop()
  }
}
上一篇 下一篇

猜你喜欢

热点阅读