我正在做一个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();
}
我有点糊涂了。请解决我的问题。
你好,普拉蒂克
1条答案
按热度按时间j91ykkif1#
您的问题是使用不同的hivecontext创建表。换句话说,第二个程序的hivecontext看不到“catacctdata”表,因为您已经用另一个hivecontext创建了这个表。使用一个hivecontext创建和读取表。
我也不明白你为什么这么做
df.write().saveAsTable("catAcctData");
在创建临时表之前。如果要创建临时表,只需使用df.registerTempTable("catAcctData");
没有df.write().saveAsTable("catAcctData");
.