使用java在apachespark中以配置单元表的形式存储数据

tktrz96b  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(383)

我正在做一个rnd,我想把我的rdd存储到hive表中。我已经用java编写了代码并创建了rdd。在转换rdd之后,我将它转换为Dataframe,然后将它存储在hive表中。但在这里我面临着两种不同的错误。

public static void main(String[] args) {  

  SparkConf sparkConf = new SparkConf().setAppName("SparkMain");
  JavaSparkContext ctx = new JavaSparkContext(sparkConf);
  HiveContext  hiveContext = new HiveContext(ctx.sc());
  hiveContext.setConf("hive.metastore.uris", "thrift://address:port");
  DataFrame df = hiveContext.read().text("/filepath");
  df.write().saveAsTable("catAcctData");
  df.registerTempTable("catAcctData");
  DataFrame sql = hiveContext.sql("select * from catAcctData");
  sql.show();
  ctx.close();

}
如果我正在执行这个程序,它运行得非常好。我可以在控制台中看到表数据。
但如果我尝试下面的代码,它会说org.apache.spark.sql.analysisexception:table not found:java

public static void main(String[] args) {  

  SparkConf sparkConf = new SparkConf().setAppName("SparkMain");
  JavaSparkContext ctx = new JavaSparkContext(sparkConf);
  HiveContext  hiveContext = new HiveContext(ctx.sc());
  hiveContext.setConf("hive.metastore.uris", "thrift://address:port");
  DataFrame sql = hiveContext.sql("select * from catAcctData");
  sql.show();
  ctx.close();

}
如果我尝试使用sqlcontext保存表数据,它会说java.lang.runtimeexception:使用sqlcontext创建的表必须是临时的。改用hivecontext。

public static void main(String[] args) {  
  SparkConf sparkConf = new SparkConf().setAppName("SparkMain");
  JavaSparkContext ctx = new JavaSparkContext(sparkConf);
  SQLContext  hiveContext = new SQLContext(ctx.sc());
  hiveContext.setConf("hive.metastore.uris", "thrift://address:port");
  DataFrame df = hiveContext.read().text("/filepath");
  df.write().saveAsTable("catAcctData");
  df.registerTempTable("catAcctData");
  DataFrame sql = hiveContext.sql("select * from catAcctData");
  sql.show();
  ctx.close();

}
我有点糊涂了。请解决我的问题。
你好,普拉蒂克

j91ykkif

j91ykkif1#

您的问题是使用不同的hivecontext创建表。换句话说,第二个程序的hivecontext看不到“catacctdata”表,因为您已经用另一个hivecontext创建了这个表。使用一个hivecontext创建和读取表。
我也不明白你为什么这么做 df.write().saveAsTable("catAcctData"); 在创建临时表之前。如果要创建临时表,只需使用 df.registerTempTable("catAcctData"); 没有 df.write().saveAsTable("catAcctData"); .

相关问题