Spark通过Dataframe操作hive

1.1、创建一个SQLContext, SQLContext(及其子类, 如本节的HiveContext)是Spark SQL所有功能的入口

SqlContext: 应该是对应spark-sql这个project; 与hive解耦,不支持hql查询;
HiveContext:应该是对应spark-hive这个项目; 与hive有部分耦合, 支持hql,是SqlContext的子类,也就是说兼容SqlContext;
此处需要注意: 如果使用SQLContext sqlContext = new SQLContext(sc);会报错。[1.13] failure: ``table'' expected but identifier t2 found

        // 构建Spark上下文
        SparkConf conf = new SparkConf()
        .setAppName("spark-hive")
        .setMaster("local[2]");    
        JavaSparkContext sc = new JavaSparkContext(conf);
        //创建SQLontext
        SQLContext sqlContext = new HiveContext(sc);

通过HiveContext进行查询,创建表,插入数据

1.2、查询, 通过SQLContext查询, 返回一个DataFrame对象

    private static void showTables(SQLContext sqlContext) {
        DataFrame df = sqlContext.sql("show tables");
        for( Row row:df.take(3)){
            System.out.println(row);
        }
    }

1.3、创建表

    private static void createTable(SQLContext sqlContext) {
        sqlContext.sql("create table t2(a String, b String)");
    }

1.4、插入数据

创建DataFrame, spark提供两种方式的RDD与DataFrame的转化

  • 1.4.1、通过反射, 第一个方法使用反射来推断包含特定类型对象的RDD的模式。这种基于反射的方法可以生成更简洁的代码,当您在编写Spark应用程序时已经了解了schema时,可以很好地工作。
  • 1.4.2、通过接口, 使用RDD和schema构建DataFrame
    • 创建RDD
    • 创建schema
    • 通过RDD和schemae构建DataFrame
    • 注册临时表,这个时候的数据只是在SQLContext存活的周期可用, 并没有存入Hvie中
    • 把临时表中的数据插入到Hive数据库中
    private static void insert(SQLContext sqlContext, JavaSparkContext sc ) {

        List<Row> rows = new ArrayList<Row>();
        for(int i = 0; i < 10; i ++) {
            //创建Row对象
            Row row = RowFactory.create(i, "value" + i);
            rows .add(row);
        }
        JavaRDD<Row> rowsRDD = sc.parallelize(rows);//构建RDD


        StructType schema2 = DataTypes.createStructType(Arrays.asList(
                DataTypes.createStructField("a", DataTypes.IntegerType, true),
                DataTypes.createStructField("b", DataTypes.StringType, true)
                )); 
        //创建DataFrame//建立起Row对象和模式之间的对应关系,也就是把数据和模式对应起来
        DataFrame df2 = sqlContext.createDataFrame(rowsRDD, schema2);
        //注册临时表,这个时候的数据只是在SQLContext存活的周期可用, 并没有存入Hvie中
        df2.registerTempTable("t2_tmp");
        // 把临时表中的数据插入到Hive数据库中
        sqlContext.sql("insert into t2 select * from t2_tmp");
    }

猜你喜欢

转载自blog.csdn.net/wuxintdrh/article/details/80957417