【问题标题】:Sharing Spark SQL tables between applications在应用程序之间共享 Spark SQL 表
【发布时间】:2018-11-09 14:16:54
【问题描述】:

在驱动程序中,我使用 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 访问表。似乎该表仅适用于最近写入它的应用程序。有什么办法可以避免吗?

【问题讨论】:

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


    【解决方案1】:

    您需要在第二个应用程序上通过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
    

    【讨论】:

      【解决方案2】:

      第 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")
      

      【讨论】:

        猜你喜欢
        • 2020-06-08
        • 1970-01-01
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多