spark读取phoenix表的速度总是比spark读取mysql慢,写入也是,所以我试了各种写法,比较一下
第一种:jdbc分区方式读取
var ds=spark.read.format("jdbc").option("url","jdbc:phoenix:master,slave1").option("dbtable", "itxw.table").option("zkUrl","master").option("partitionColumn", "id").option("lowerBound", "0").option("upperBound","15213372").option("numPartitions","500").load
这种方式和读取mysql数据表的方式是一样的,为了防止数据倾斜,最好获取maxid作为upperBound。这种方式是速度最快的了
第二种:官方提供的phoenixTableAsDataFrame的方法
import org.apache.phoenix.spark._ var ds=spark.sqlContext.phoenixTableAsDataFrame("itxw.table",Seq("PROJECT_NAME","PROJECT_ID"),Option("project_id='bcxw.net'"),Option("master"),null)
phoenix官方提供的phoenixTableAsDataFrame这种方法,速度还是很可观的,需要指定列名,也可以不指定列名,也可以指定条件。
另外:
val configuration = new Configuration() org.apache.phoenix.spark.toSparkSqlContextFunctions(spark.sqlContext).phoenixTableAsDataFrame("datacenter.quest_score",Seq(),Option(""),Option("master"),null,configuration)
上面的写法中import org.apache.phoenix.spark._,和这里按包调用时调用的不是同一个方法。
第三种:spark read org.apache.phoenix.spark方法
var ds=spark.read.format("org.apache.phoenix.spark").option("table", "itxw.table").option("zkUrl",ConfigModel.hbaseZkurl).load
这种方法写法简单,貌似官方文档也提到这种写法,但速度不咋滴,估计和phoenix种select * 很慢是一个道理吧