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

时间:2017-01-23 16:42:22

标签: scala apache-spark apache-spark-sql

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

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访问表。似乎该表仅适用于最近写入的应用程序。有没有办法避免这种情况?

2 个答案:

答案 0 :(得分:0)

您需要在第二个应用程序上通过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 :(得分:0)

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

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

第2步:在spark shell中访问它们

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