使用 Java 将数据存储为 Apache Spark 中的配置单元表
Posted
技术标签:
【中文标题】使用 Java 将数据存储为 Apache Spark 中的配置单元表【英文标题】:Storing data as hive table in Apache Spark using Java 【发布时间】:2018-02-01 07:49:36 【问题描述】:我正在做一个 RND,我想将我的 RDD 存储到 hive 表中。我已经用 Java 编写了代码并创建了 RDD。转换 RDD 后,我将其转换为 Data Frame,然后将其存储在 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】:您的问题是您使用不同的 HiveContext 创建表。 换句话说,第二个程序中的 HiveContext 看不到“catAcctData”表,因为您已经使用另一个 HiveContext 创建了此表。 使用一个 HiveContext 来创建和读取表。
另外我不明白你为什么在创建临时表之前这样做df.write().saveAsTable("catAcctData");
。如果你想创建临时表,你只需要使用df.registerTempTable("catAcctData");
withoutdf.write().saveAsTable("catAcctData");
。
【讨论】:
那么 Yehor Krivokon 我如何才能读取之前创建的表格?你能指导我吗? 1) HiveContext 已弃用。添加 Hive 支持使用:SparkSession.builder().enableHiveSupport(); 2) 使用先前创建的 SQLContext 创建表。使用:SQLContext.getOrCreate(spark.sparkContext()); 3) 使用这个获取 SparkSession:SparkSession spark = SparkSession.builder().enableHiveSupport().getOrCreate(); 但是我有一个限制,我不能使用 spark2.0,我只在 hadoop 中安装了 spark 1.6,所以我不能使用 sparksession。 好的,你可以使用getOrcreate方法获取sparkContext,而不是从SparkSession获取。以上是关于使用 Java 将数据存储为 Apache Spark 中的配置单元表的主要内容,如果未能解决你的问题,请参考以下文章
React SPA with Express Backend API - 将 JWT 存储在本地存储中并限制 API 仅访问 SPA 的 Web 服务器 IP
使用 Java 在 Apache Spark 中从数据集中复制一行 n 次
带有存储在 cookie 中的刷新令牌的 SPA - 如何使用 IdentityServer4 进行配置?
猪:无法将 java.lang.String 转换为 org.apache.avro.util.Utf8 与 STORE 中的 AvroStorage