Spring boot with Hive

本文节选自《Netkiller Java 手札》

摘要: spring boot 1.5.6 + hive 2.3.0 + hadoop 2.5.0 + hbase 1.3.1

5.29. Spring boot with Apache Hive

5.29.1. Maven

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-hadoop</artifactId>
			<version>2.5.0.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
		<dependency>
			<groupId>org.apache.hive</groupId>
			<artifactId>hive-jdbc</artifactId>
			<version>2.3.0</version>
			<exclusions>
				<exclusion>
					<groupId>org.eclipse.jetty.aggregate</groupId>
					<artifactId>*</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jdbc</artifactId>
			<version>8.5.20</version>
		</dependency>

5.29.2. application.properties

hive 数据源配置项

hive.url=jdbc:hive2://172.16.0.10:10000/defaulthive.driver-class-name=org.apache.hive.jdbc.HiveDriverhive.username=hadoophive.password=

用户名是需要具有 hdfs 写入权限,密码可以不用写

如果使用 yaml 格式 application.yml 配置如下

hive:  
  url: jdbc:hive2://172.16.0.10:10000/default
  driver-class-name: org.apache.hive.jdbc.HiveDriver 
  type: com.alibaba.druid.pool.DruidDataSource  username: hive  password: hive

5.29.3. Configuration

package cn.netkiller.config;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;@Configurationpublic class HiveConfig {
	private static final Logger logger = LoggerFactory.getLogger(HiveConfig.class);	@Autowired
	private Environment env;	@Bean(name = "hiveJdbcDataSource")	@Qualifier("hiveJdbcDataSource")
	public DataSource dataSource() {
		DataSource dataSource = new DataSource();
		dataSource.setUrl(env.getProperty("hive.url"));
		dataSource.setDriverClassName(env.getProperty("hive.driver-class-name"));
		dataSource.setUsername(env.getProperty("hive.username"));
		dataSource.setPassword(env.getProperty("hive.password"));
		logger.debug("Hive DataSource");
		return dataSource;
	}	@Bean(name = "hiveJdbcTemplate")
	public JdbcTemplate hiveJdbcTemplate(@Qualifier("hiveJdbcDataSource") DataSource dataSource) {
		return new JdbcTemplate(dataSource);
	}
}

你也可以使用 DruidDataSource

package cn.netkiller.api.config; 

@Configuration  public class HiveDataSource {  
      
    @Autowired  
    private Environment env;  
  
    @Bean(name = "hiveJdbcDataSource")    @Qualifier("hiveJdbcDataSource")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(env.getProperty("hive.url"));
        dataSource.setDriverClassName(env.getProperty("hive.driver-class-name"));
        dataSource.setUsername(env.getProperty("hive.username"));
        dataSource.setPassword(env.getProperty("hive.password"));
        return dataSource;
    }    @Bean(name = "hiveJdbcTemplate") 
    public JdbcTemplate hiveJdbcTemplate(@Qualifier("hiveJdbcDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

5.29.4. CURD 操作实例

Hive 数据库的增删插改操作与其他数据库没有什么不同。

package cn.netkiller.web;import java.util.Iterator;import java.util.List;import java.util.Map;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("/hive")public class HiveController {	private static final Logger logger = LoggerFactory.getLogger(HiveController.class);	@Autowired
	@Qualifier("hiveJdbcTemplate")
	private JdbcTemplate hiveJdbcTemplate;	@RequestMapping("/create")
	public ModelAndView create() {

		StringBuffer sql = new StringBuffer("create table IF NOT EXISTS ");
		sql.append("HIVE_TEST");
		sql.append("(KEY INT, VALUE STRING)");
		sql.append("PARTITIONED BY (CTIME DATE)"); // 分区存储
		sql.append("ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' "); // 定义分隔符
		sql.append("STORED AS TEXTFILE"); // 作为文本存储

		// drop table
		// StringBuffer sql = new StringBuffer("DROP TABLE IF EXISTS ");
		// sql.append("HIVE_TEST1");
		logger.info(sql.toString());
		hiveJdbcTemplate.execute(sql.toString());		return new ModelAndView("index");

	}	@RequestMapping("/insert")
	public String insert() {
		hiveJdbcTemplate.execute("insert into hive_test(key, value) values('Neo','Chen')");		return "Done";
	}	@RequestMapping("/select")
	public String select() {
		String sql = "select * from HIVE_TEST";
		List<Map<String, Object>> rows = hiveJdbcTemplate.queryForList(sql);
		Iterator<Map<String, Object>> it = rows.iterator();		while (it.hasNext()) {
			Map<String, Object> row = it.next();
			System.out.println(String.format("%s\t%s", row.get("key"), row.get("value")));
		}		return "Done";
	}	@RequestMapping("/delete")
	public String delete() {
		StringBuffer sql = new StringBuffer("DROP TABLE IF EXISTS ");
		sql.append("HIVE_TEST");
		logger.info(sql.toString());
		hiveJdbcTemplate.execute(sql.toString());		return "Done";
	}
}

原文发布于微信公众号 - Netkiller(netkiller-ebook)

原文发表时间:2017-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏VRPinea

VR动画电影《Raising a Rukus》|一对熊孩子的异世界探险之旅

VR动画电影《Raising a Rukus(拉克斯的魔幻旅程)》,讲述的是一对双胞胎在生日那天,与他们新获得的狗狗一起探险异世界的故事。

1111
来自专栏VRPinea

《夏日乐园》|过山车、潜水艇还有蝙蝠战车!炎炎夏日里的VR专属游乐场

游戏开始后,玩家将置身于一个颇为引人入胜的游乐场场景中,逼真的场景塑造加上颇具夏日味道的绚丽色彩,再配以欢欣惬意的音乐,仿佛真的来到了周末的游乐场。除了依旧属于...

631
来自专栏VRPinea

智能家居应用|三星套路玩的深,AR走进格里芬

821
来自专栏菩提树下的杨过

Javascript:模仿淘宝的信用评价

老板昨天开会说:要给公司的购物平台增加信用评价功能,用户体验参考淘宝。 于是今天研究了一下,用jQuery模似一个类似的效果:  ? 代码如下: <!D...

2067
来自专栏程序员互动联盟

黑程序员最狠的十句话

1. 今天去买了几箱水果,结账一共260元。我说:“都是老顾客了,零头就抹了吧。”老板也很爽快:“行,凑个整,你给256块吧。”我顿时肃然起敬:“您以前当过程序...

3477
来自专栏互联资讯

震撼穿越“亿年壶穴、天地奇观”!无人机成功穿越白云山亿年大壶穴!

福安白云山是史志记载的“闽东第一山”。因四季云雾缭绕,弥望如海,故名白云山。说起闽东宁德的风景,大家都不由想起太姥山和白水洋。可大家知道吗?福建福安白云山、屏南...

1144
来自专栏小狼的世界

惊闻NBC在奥运后放弃使用Silverlight

奥运初始的时候,媒体对于NBC使用Silverlight技术进行了高调的宣传,没想到奥运会结束刚刚三周的时间,NBC就弃用了Siverlight,重新采用Ado...

982
来自专栏量子位

AI又输了!中国传奇Dota2冠军联手,OpenAI快速进化然并卵

虽说在今年TI8上,中国各队战绩不如以往,不过今天,三支被淘汰队伍的教练+昨天直播的两名中文解说,如愿以偿地在表演赛上吊打了OpenAI。

1557
来自专栏挖数

小鲜肉崩盘!吴亦凡、鹿晗人气下滑超50%

这个时间点,跟EXO四子归国日期不谋而合,因此大致可以把EXO四子称为第一届小鲜肉。

2853
来自专栏域名资讯

小心新型“抢注域名”诈骗 !

浙江的林老板花一万多元注册的域名,有人说要用百万元收购。喜不自胜的他又听信了对方的建议掏钱让他们帮忙抢注类似域名坐等赚钱。前前后后花了47万元,最后人却不见了,...

810

扫码关注云+社区