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 = spark.read .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 = { JdbcDialects.registerDialect(HiveSqlDialect) } 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(".") } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗