我正在做一个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
答案 0 :(得分:1)
您的问题是您使用不同的HiveContext创建表。 换句话说,来自第二个程序的HiveContext没有看到" catAcctData" table,因为您已使用另一个HiveContext创建了此表。 使用一个HiveContext创建和读取表。
另外,在创建临时表之前,我不明白为什么要这样做df.write().saveAsTable("catAcctData");
。如果您想创建临时表,则只需使用df.registerTempTable("catAcctData");
而不使用df.write().saveAsTable("catAcctData");
。