在驱动程序中,我使用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")