Apache spark 在spark 2.1中,dataframe.CreateOrreplaceTestable为什么不替换现有表?

Apache spark 在spark 2.1中,dataframe.CreateOrreplaceTestable为什么不替换现有表?,apache-spark,Apache Spark,我正在缓存数据帧,以便以后可以在不从磁盘读取的情况下检索它们。在对数据集进行转换之后,我想在缓存中更新它。 我缓存数据帧,如下所示: df.createOrReplaceTempView(uniqueName) sqlContext.cacheTable(uniqueName) spark UI的“存储”选项卡显示一个条目,该条目具有我指定的唯一名称,大小为63.7KB。 现在我转换数据帧(通过添加列)并以相同的方式再次缓存它 现在存储选项卡中有两个条目(对于具有相同uniqueName的表)

我正在缓存数据帧,以便以后可以在不从磁盘读取的情况下检索它们。在对数据集进行转换之后,我想在缓存中更新它。 我缓存数据帧,如下所示:

df.createOrReplaceTempView(uniqueName)
sqlContext.cacheTable(uniqueName)
spark UI的“存储”选项卡显示一个条目,该条目具有我指定的唯一名称,大小为63.7KB。 现在我转换数据帧(通过添加列)并以相同的方式再次缓存它

现在存储选项卡中有两个条目(对于具有相同uniqueName的表),而我只希望看到一个条目。第一个条目的大小为65.2KB,表示转换后的数据帧。下面列出的一个表示第一个(63.7KB)

我认为存储选项卡可能会显示缓存的表,而不仅仅是注册的视图,所以我尝试调用

sqlContext.uncacheTable(uniqueName)
就在我调用上述两行缓存数据帧之前。 它不会改变这样一个事实,即在第二次调用df.createOrReplaceTempView(uniqueName)后,存储选项卡中将显示两个表

接下来我想我会试着打电话

   if (sqlContext.tableNames().contains(uniqueName)) {
      sqlContext.dropTempTable(uniqueName)
   }
就在调用这两行缓存数据帧之前。这可以删除存储选项卡中的重复行,但当我尝试使用缓存表时(如计算行数),会出现如下异常

ERROR he.spark.executor.Executor [] [akka://JobServer/user/context-supervisor/sql-context] - Exception in task 0.0 in stage 36.0 (TID 42)
java.lang.RuntimeException: Malformed line in FAILFAST mode: No Braund, Mr. Owen Harris male    22.0    A/5 21171       7.25   ?3       S       1       0       4
        at org.apache.spark.sql.execution.datasources.csv.CSVRelation$$anonfun$csvParser$3.apply(CSVRelation.scala:106)
        at org.apache.spark.sql.execution.datasources.csv.CSVRelation$$anonfun$csvParser$3.apply(CSVRelation.scala:94)
        at org.apache.spark.sql.execution.datasources.csv.CSVFileFormat$$anonfun$buildReader$1$$anonfun$apply$2.apply(CSVFileFormat.scala:167)
        at org.apache.spark.sql.execution.datasources.csv.CSVFileFormat$$anonfun$buildReader$1$$anonfun$apply$2.apply(CSVFileFormat.scala:166)
看起来它无法读取缓存数据帧的第一行,因为它包含额外的列,出于某种原因,它不希望这样。 为什么createOrReplaceTempView实际上不替换具有相同名称的视图?我应该提交一个bug,还是我不了解API是如何工作的


我已经查看了,但没有看到验证createOrReplaceTempView是否将替换已存在的视图的测试

我可以通过在调用sqlContext.DropTestable(uniqueName)之后添加Thread.sleep(2000)来避免上面的FAILFAST错误,但这应该不是必需的。似乎对DropTestable的调用是异步进行的,并且没有可靠的方法知道何时完成。我遗漏了什么?我为此打开了。每个人都找到了一个解释?我可以通过在调用sqlContext.droptentable(uniqueName)之后添加一个Thread.sleep(2000)来避免上面的FAILFAST错误,但这应该不是必需的。似乎对DropTestable的调用是异步进行的,并且没有可靠的方法知道何时完成。我错过了什么?我打开了这个。每个人都找到了解释?