Spark读取Hive的三种⽅式session如何设置和读取
Spark读取Hive的三种⽅式
直接读数据源
HiveJDBC
配置⽂件
直接读数据源
因为hive只是起到映射的作⽤,所以最简单、直观的⽅式就是直接读取数据的存储组件(HDFS\HBASE)
HiveJDBC
spark读hive的jdbc没写过,不过应该和mysql的差不多,直接贴代码
val properties = new Properties()
properties.put("user",HIVE_USER)
properties.put("password",HIVE_PASSWORD)
properties.put("driver",HIVE_DRIVER)
看起来毫⽆问题,拿mysql做实验也能准确读出数据,下⾯看读hive的输出:
+----+------+-----+------+--------+
|c.id|c.name|c.age|c.city|c.s_date|
+----+------+-----+------+--------+
|c.id|c.name|c.age|c.city|c.s_date|
|c.id|c.name|c.age|c.city|c.s_date|
|c.id|c.name|c.age|c.city|c.s_date|
|c.id|c.name|c.age|c.city|c.s_date|
+----+------+-----+------+--------+
看起来不太对劲,跟代码进去,看看执⾏了什么操作,于是:
select "c.id","c.name","c.age","c.city","c.s_date" from c
原来最后执⾏的sql张这个样⼦,怪不得查出来的都是字段名称的字符串。
分析问题应该是处理hive的转译符出错了,那继续跟代码看有什么地⽅可以设置。……最后悲剧的发现spark根本没添加HiveJDBC
registerDialect(MySQLDialect)
registerDialect(PostgresDialect)
registerDialect(DB2Dialect)
registerDialect(MsSqlServerDialect)
registerDialect(DerbyDialect)
registerDialect(OracleDialect)
不过没关系,经观察发现这些Dialect都继承了JdbcDialect类,并重写了canHandle和quoteIdentifier⽅法,直接上代码
private case object HiveSqlDialect extends JdbcDialect {
override def canHandle(url : String): Boolean = url.startsWith("jdbc:hive2")
override def quoteIdentifier(colName: String): String = {
s"转译符$colName转译符"
}
}
最后再把你写的Dialect添加到JdbcDialects中
static {
HiveSqlDialect hiveSqlDialect_ = new HiveSqlDialect();
}
之后就跟操作mysql⼀样没差别了
配置⽂件
这种⽅式是官⽅所提供的,并且在⽹上搜到的⼤部分链接⽅式都是这种需要在client端配置l⽂件的⽅式,linux环境下需要将该⽂件放⼊到resources⽂件夹下即可,如果想要在windows本地运⾏需要以下⼏步:
1:本机配置hadoop环境变量
在该地址下载hadoop对应版本,然后解压配置HADOOP_HOME
2:然后依次下载hadoop.dll、libwinutils.lib、,并放⼊到%HADOOP_HOME%\bin下,到此本机环境配置完毕
3:编写l⽂件并放到resources下⾯
<configuration>
<property>
<name&astore.local</name>
<value>false</value>
</property>
<property>
<name&astore.uris</name>
<value>thrift://IP:9083</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://IP:8020</value>
</property>
<property>
<name&astore.warehouse.dir</name>
<value>HIVE所配置HDFS地址</value>
</property>
<property>
<name>tion.user</name>
<value>username</value>
</property>
<property>
<name>tion.password</name>
<value>password</value>
</property>
</configuration>
4:最后在创建Session的时候添加⼀个enableHiveSupport(),并设置⼀个系统变量hadoop.home.dir指向你本机的HADOOP_HOME即可
val spark: SparkSession = SparkSession
.builder()
.enableHiveSupport()
.appName("downloadSyncData")
.master("local[2]")
.getOrCreate()
System.setProperty("hadoop.home.dir","D:\\Program\\hadoop-2.7.6")
spark.sql("select * from bigdata.schema_test").show()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论