Spark读取Hive数据的⽅式
Spark读取Hive数据的⽅式主要有两种:
1、通过访问hive metastore的⽅式,这种⽅式通过访问hive的metastore元数据的⽅式获取表结构信息和该表数据所存放的HDFS路径,这种⽅式的特点是效率⾼、数据吞吐量⼤、使⽤spark操作起来更加友好。
2、通过spark jdbc的⽅式访问,就是通过链接hiveserver2的⽅式获取数据,这种⽅式底层上跟spark链接其他rdbms上⼀样,可以采⽤sql的⽅式先在其数据库中查询出来结果再获取其结果数据,这样⼤部分数据计算的压⼒就放在了数据库上。
两种⽅式的具体实现⽰例
⾸先创建Spark Session对象:
val spark = SparkSession.builder()
.appName("test")
.enableHiveSupport()
.getOrCreate()
⽅式⼀(推荐)直接采⽤Spark on Hive的⽅式读取数据,这样SparkSession在使⽤sql的时候会去集hive中的库表,加载其hdfs数据与其元数据组成DataFrame
val df = spark.sql("select * from test.user_info")
⽅式⼆采⽤spark jdbc的⽅式,如果有特别的使⽤场景的话也可以通过这种⽅法来实现。
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.jdbc.{JdbcDialect, JdbcDialects}
object test{
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.master("local[2]")
.appName("test")
.getOrCreate()
register() //如果不⼿动注册,只能获取到数据库中的表结构,⽽不能获取到数据
val df = ad
.format("jdbc")
.option("driver","org.apache.hive.jdbc.HiveDriver")
.option("url","jdbc:hive2://xxx:10000/")
.option("user","hive")
.option("password",xxx)
.option("fetchsize", "2000")
.option("dbtable","test.user_info")
.load()
df.show(10)
}
def register(): Unit = {
}
case object HiveSqlDialect extends JdbcDialect {
override def canHandle(url: String): Boolean = url.startsWith("jdbc:hive2")
override def quoteIdentifier(colName: String): String = {
colName.split('.').map(part => s"`$part`").mkString(".")
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论