在驱动程序中,我使用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访问表。似乎该表仅适用于最近写入的应用程序。有没有办法避免这种情况?
答案 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")