Java 如何通过执行内部联接并将其引入配置单元,从hbase表中检索数据

Java 如何通过执行内部联接并将其引入配置单元,从hbase表中检索数据,java,apache-spark,hive,hbase,spark-dataframe,Java,Apache Spark,Hive,Hbase,Spark Dataframe,我有两个Hbase表“hbaseTable”、“hbaseTable1”和配置单元表“hiveTable” 我的查询如下所示: 'insert overwrite hiveTable select col1, h2.col2, col3 from hbaseTable h1,hbaseTable2 h2 where h1.col=h2.col2'; 我需要在hbase中进行内部连接,并将数据带到配置单元。我们使用的是hive和java,它的性能非常差。 因此,计划使用spark改变方法。i、

我有两个Hbase表“
hbaseTable
”、“
hbaseTable1
”和配置单元表“
hiveTable
” 我的查询如下所示:

'insert overwrite hiveTable select col1, h2.col2, col3 from hbaseTable h1,hbaseTable2 h2 where h1.col=h2.col2';
我需要在hbase中进行内部连接,并将数据带到配置单元。我们使用的是hive和java,它的性能非常差。 因此,计划使用spark改变方法。i、 e,用java点燃火花 如何使用SPARK从JAVA代码连接到hbase

现在,我的spark代码应该加入hbase,并通过上面的查询将数据引入配置单元


请提供示例代码。

如果您使用spark加载hbase数据,那么为什么要将其加载到hive中? 您可以使用类似于配置单元的spark sql,从而使用sql。 您可以不使用配置单元查询数据。 例如:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;
import scala.Tuple2;
import java.util.Arrays;

public class SparkHbaseHive {
    public static void main(String[] args) {
        Configuration conf = HBaseConfiguration.create();
        conf.set(TableInputFormat.INPUT_TABLE, "test");
        JavaSparkContext jsc = new JavaSparkContext(new SparkConf().setAppName("Spark-Hbase").setMaster("local[3]"));
        JavaPairRDD<ImmutableBytesWritable, Result> source = jsc
                .newAPIHadoopRDD(conf, TableInputFormat.class,
                        ImmutableBytesWritable.class, Result.class);
        SQLContext sqlContext = new SQLContext(jsc);
        JavaRDD<Table1Bean> rowJavaRDD = 

source.map((Function<Tuple2<ImmutableBytesWritable, Result>, Table1Bean>) object -> {
            Table1Bean table1Bean = new Table1Bean();
            table1Bean.setRowKey(Bytes.toString(object._1().get()));


table1Bean.setColumn1(Bytes.toString(object._2().getValue(Bytes.toBytes("colfam1"), Bytes.toBytes("col1"))));
            return table1Bean;
    });
        DataFrame df = sqlContext.createDataFrame(rowJavaRDD, Table1Bean.class);

        //similarly create df2
        //use df.join() and then register as joinedtable or register two tables and join
        //execute sql queries

        //Example of sql query on df
        df.registerTempTable("table1");
        Arrays.stream(sqlContext.sql("select * from table1").collect()).forEach(row -> System.out.println(row.getString(0) + "," + row.getString(1)));

    }
}
public class Table1Bean {
    private String rowKey;
    private String column1;


    public String getRowKey() {
        return rowKey;
    }

    public void setRowKey(String rowKey) {
        this.rowKey = rowKey;
    }

    public String getColumn1() {
        return column1;
    }

    public void setColumn1(String column1) {
        this.column1 = column1;
    }
}
import org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.hbase.HBaseConfiguration;
导入org.apache.hadoop.hbase.client.Result;
导入org.apache.hadoop.hbase.io.ImmutableBytesWritable;
导入org.apache.hadoop.hbase.mapreduce.TableInputFormat;
导入org.apache.hadoop.hbase.util.Bytes;
导入org.apache.spark.SparkConf;
导入org.apache.spark.api.java.javapairdd;
导入org.apache.spark.api.java.JavaRDD;
导入org.apache.spark.api.java.JavaSparkContext;
导入org.apache.spark.api.java.function.function;
导入org.apache.spark.sql.DataFrame;
导入org.apache.spark.sql.SQLContext;
导入scala.Tuple2;
导入java.util.array;
公共级SparkHbaseHive{
公共静态void main(字符串[]args){
Configuration=HBaseConfiguration.create();
conf.set(TableInputFormat.INPUT_表,“测试”);
JavaSparkContext jsc=新的JavaSparkContext(新的SparkConf().setAppName(“Spark Hbase”).setMaster(“local[3]”);
javapairdd source=jsc
.newAPIHadoopRDD(conf,TableInputFormat.class,
ImmutableBytesWritable.class、Result.class);
SQLContext SQLContext=新的SQLContext(jsc);
JavaRDD行JavaRDD=
source.map((函数)对象->{
Table1Bean Table1Bean=新的Table1Bean();
表1 bean.setRowKey(Bytes.toString(object._1().get());
表1 bean.setColumn1(Bytes.toString(object._2().getValue(Bytes.toBytes(“colfam1”)、Bytes.toBytes(“col1”));
返回表1Bean;
});
DataFrame df=sqlContext.createDataFrame(rowJavaRDD,Table1Bean.class);
//类似地,创建df2
//使用df.join()然后注册为joinedtable,或者注册两个表并连接
//执行sql查询
//df上的sql查询示例
df.注册表可清空(“表1”);
Arrays.stream(sqlContext.sql(“select*fromtable1”).collect()).forEach(row->System.out.println(row.getString(0)+“,”+row.getString(1));
}
}
公共类表1Bean{
私有字符串行键;
私有字符串第1列;
公共字符串getRowKey(){
返回rowKey;
}
public void setRowKey(字符串rowKey){
this.rowKey=rowKey;
}
公共字符串getColumn1(){
返回列1;
}
公共void集合column1(字符串column1){
this.column1=column1;
}
}
如果出于某些原因需要使用配置单元,请使用HiveContext从配置单元读取数据,并使用saveAsTable持久化数据。 如果有疑问,请告诉我