使用Java

时间:2018-02-01 07:49:37

标签: java apache-spark hive apache-spark-sql hiveql

我正在做一个RND,我想把我的RDD存储到hive表中。我用Java编写了代码并创建了RDD。转换RDD后,我将其转换为数据帧,然后将其存储在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:找不到表: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创建的表必须是TEMPORARY。改为使用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();

}

我在这里有点迷惑。请解决我的问题。

此致 PRATIK

1 个答案:

答案 0 :(得分:1)

您的问题是您使用不同的HiveContext创建表。 换句话说,来自第二个程序的HiveContext没有看到" catAcctData" table,因为您已使用另一个HiveContext创建了此表。 使用一个HiveContext创建和读取表。

另外,在创建临时表之前,我不明白为什么要这样做df.write().saveAsTable("catAcctData");。如果您想创建临时表,则只需使用df.registerTempTable("catAcctData");而不使用df.write().saveAsTable("catAcctData");