在应用程序之间共享Spark SQL表



在驱动程序中,我使用Spark SQL将从Twitter流中提取的一些数据保存在表中。我没有使用配置单元,所以它被保存到spark-warehouse目录中。然后我尝试通过spark-shell访问它,但sql()命令无法访问该表(它甚至没有列在sqlContext.tables中)。由驱动器程序和sparkshell创建的表都保存在同一个文件夹中,但对于不是它们来源的应用程序来说是不可见的。

Spark应该这样做吗?我是不是错过了什么?有没有办法共享这些表格?


更新:我设法拼凑出一个例子。我提交了以下代码的驱动程序:

Seq(1).toDF("number").write.saveAsTable("number")
spark.sqlContext.sql("select * from number").show

结果是:

+------+
|number|
+------+
|     1|
+------+

然后我在spark-shell中运行以下命令:

scala> sql("select * from number")
org.apache.spark.sql.AnalysisException: Table or view not found: number; line 1 pos 14

更新2。我设法创建了一个解决方法,将空的DataFrame附加到表中,这样我就可以正常访问它了。

scala> spark.sqlContext.emptyDataFrame.write.mode(SaveMode.Append).saveAsTable("number")
scala> sql("select * from number")
res2: org.apache.spark.sql.DataFrame = [number: int]
scala> sql("select * from number").show
+------+
|number|
+------+
|     1|
+------+

但现在驱动程序无法通过Spark SQL访问表。这个表似乎只对最近写入的应用程序可用。有什么方法可以避免这种情况吗?

您需要在第二个应用程序上通过df.createOrReplaceTempView("number")声明表

// App1
val df = Seq(1).toDF("number")
df.write.saveAsTable(hdfsOrS3Path)

在第二个应用程序中读回:

// App2: 
val df = spark.read.parquet(hdfsOrS3Path)
df.createOrReplaceTempView("number")
spark.sqlContext.sql("select * from number").show

步骤1:通过spark应用程序保存所需的数据帧

//I am saving a dataframe in parquet format to hive tables
dfTest.write.format("parquet").mode("overwrite").saveAsTable("myDB.number")

步骤2:在火花壳中访问它们

var readDF = sqlContext.read.parquet("/user/hive/warehouse/myDB.db/number")
or
var readDF = sqlContext.sql("select * from myDB.number")

相关内容

  • 没有找到相关文章

最新更新