package cn.hhb.spark.sql;import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaSparkContext;import org.apache.spark.sql.DataFrame;import org.apache.spark.sql.Row;import org.apache.spark.sql.hive.HiveContext;/** * Created by dell on 2017/7/27. */public class HiveDataSource { public static void main(String[] args) { // 创建SparkConf SparkConf conf = new SparkConf() .setAppName("HiveDataSource").setMaster("local") .set("spark.testing.memory", "2147480000"); // 创建javasparkContext JavaSparkContext sc = new JavaSparkContext(conf); // 创建HiveContext,注意,这里,接收的是sparkcontext作为参数,不是javasparkcontext HiveContext hiveContext = new HiveContext(sc.sc());// 第一个功能:使用hivecontext的sql() hql()方法,可以执行hive中能够执行的hive语句 // 判断是否存在student_infos表,如果存在则删除 hiveContext.sql("DROP TABLE IF EXISTS student_infos"); // 判断是否不存在student_infos表,如果不存在则创建 hiveContext.sql("DROP TABLE IF NOT EXISTS student_infos (name STRING, age INT)"); // 将学生基本信息数据导入student_infos表 hiveContext.sql("LOAD DATA LOCAL INPATH '/user/local/student_infos.txt' INTO TABLE student_infos"); // 用同样的方式给student_scores导入数据 hiveContext.sql("DROP TABLE IF EXISTS student_scores"); hiveContext.sql("DROP TABLE IF NOT EXISTS student_scores (name STRING, age INT)"); // 将学生基本信息数据导入student_infos表 hiveContext.sql("LOAD DATA LOCAL INPATH '/user/local/student_scores.txt' INTO TABLE student_scores"); // 第二个功能,执行sql还可以返回dataframe,用于查询 // 执行sql查询,关联两张表,查询成绩大于80分的学生 DataFrame goodStudentsDF = hiveContext.sql("select si.name, si.age, ss.score from student_infos si join student_scores ss on si.name=ss.name where ss.score >=80");// 第三个功能,可以将dataframe中的数据,理论上来说,dataframe对应的rdd的元素,是row即可将dataframe中的数据保存到hive表中 // 将dataframe中的数据保存到good_student_infos表中 hiveContext.sql("DROP TABLE IF EXISTS good_student_infos"); goodStudentsDF.saveAsTable("good_student_infos");// 第四个功能,可以用table()方法,针对hive表,直接创建dataframe // 然后针对good_student_infos表,直接创建dataframe Row[] goodStudentRows = hiveContext.table("good_student_infos").collect(); for (Row goodStudentRow : goodStudentRowss){ System.out.println(goodStudentRow); } sc.close(); }}