背景
在使用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()
}
}
网友评论