spark读取Hive的几种方式
1.HiveJDBC 2.通过服务的方式
直接读数据源
因为hive只是起到映射的作用,所以最简单、直观的方式就是直接读取数据的存储组件(HDFS\HBASE)
1.HiveJDBC
方式一:
val spark = pec.get[SparkSession]()
val dbtable = "( " + sql + ") AS Temp"
val jdbcDF = spark.read.format("jdbc")
.option("url", jdbcUrl)
.option("driver", driverName)
.option("dbtable", dbtable)
.option("user", hiveUser)
.option("password", hivePassword)
.option("fetchsize", "100")
.load()
方式二:
val properties = new Properties()
properties.put("user",hiveUser)
properties.put("password",hivePassword)
properties.put("driver",driverName)
spark.read.jdbc("jdbc:hive2://IP:10000/bigdata",sql,properties)
如果这么读的话发现的确是可以读,但是总有一个temp开头的东西
?问题原因:
发现spark根本没添加HiveJDBC
?不过没关系,经观察发现这些Dialect都继承了JdbcDialect类,并重写了canHandle和quoteIdentifier方法,直接上代码
解决方法一:
class HiveSqlDialect extends JdbcDialect {
override def canHandle(url: String): Boolean = url.startsWith("jdbc:hive2")
override def quoteIdentifier(colName: String): String = {
if (colName.contains(".")) {
val colName1 = colName.substring(colName.indexOf(".") + 1)
return s"`$colName1`"
}
s"`$colName`"
}
}
JdbcDialects.registerDialect(new HiveSqlDialect)
val spark = pec.get[SparkSession]()
val dbtable = "( " + sql + ") AS Temp"
val jdbcDF = spark.read.format("jdbc")
.option("url", jdbcUrl)
.option("driver", driverName)
.option("dbtable", dbtable)
.option("user", hiveUser)
.option("password", hivePassword)
.option("fetchsize", "100")
.load()
然后在连接上加上??hive.resultset.use.unique.column.names=false
"url" ="jdbc:hive2://192.168.0.0:10000/test?hive.resultset.use.unique.column.names=false"
解决方法二:
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.resultset.use.unique.column.names</name>
<value>false</value>
</property>
在hive-site.xml文件中加入上面那个配置,连接就不用写了
2.通过服务的方式
hive.metastore.uris=thrift://192.168.*.*:9083
val spark = SparkSession.builder()
.master("local[*]")
.appName("MysqlReadTest")
.config("spark.driver.memory", "1g")
.config("spark.executor.memory", "2g")
.config("spark.cores.max", "2")
//.config("hive.metastore.uris","thrift://192.168.*.*:9083")
//.enableHiveSupport() --spark on hive
.getOrCreate()
spark.sql("select * from bigdata.schema_test").show()
https://blog.csdn.net/m0_37948565/article/details/81943071
|