Sparklyr" NoSuchTableException"子集化数据后出错

时间:2017-03-28 17:56:36

标签: r apache-spark apache-spark-sql sparklyr

我是sparklyr的新手,并且没有接受任何正式培训 - 在这个问题之后这将变得明显。我对频谱的统计学方面也有更多的帮助。我在设置Spark DataFrame之后收到错误。

考虑以下示例:

library(sparklyr)
library(dplyr)

sc <- spark_connect(master = "local[*]")
iris_tbl <- copy_to(sc, iris, name="iris", overwrite=TRUE)

#check column names
colnames(iris_tbl)

#subset so only a few variables remain  
subdf <- iris_tbl %>%
  select(Sepal_Length,Species)

subdf <- spark_dataframe(subdf)

#error happens when I try this operation
spark_session(sc) %>% 
  invoke("table", "subdf")

我得到的错误是:

Error: org.apache.spark.sql.catalyst.analysis.NoSuchTableException
        at org.apache.spark.sql.hive.client.ClientInterface$$anonfun$getTable$1.apply(ClientInterface.scala:122)
        at org.apache.spark.sql.hive.client.ClientInterface$$anonfun$getTable$1.apply(ClientInterface.scala:122)

错误还有其他几行。

我不明白为什么我会收到此错误。 &#34; subdf&#34;是一个Spark DataFrame

1 个答案:

答案 0 :(得分:1)

要了解为什么这不起作用,您必须了解copy_to时会发生什么。内部sparklyr将使用Spark metastore注册临时表,并将其或多或少视为另一个数据库。这就是原因:

spark_session(sc) %>% invoke("table", "iris")

可以找到“虹膜”表:

<jobj[32]>
  class org.apache.spark.sql.Dataset
  [Sepal_Length: double, Sepal_Width: double ... 3 more fields]
另一方面,

subdf只是普通的本地对象。它未在Metastore中注册,因此无法使用Spark目录访问它。要使其工作,您可以注册Spark DataFrame

subdf <- iris_tbl %>% 
  select(Sepal_Length, Species)

spark_dataframe(subdf) %>%
  invoke("createOrReplaceTempView", "subdf")

copy_to如果数据足够小,可由驱动程序处理:

subdf <- iris_tbl %>% 
  select(Sepal_Length, Species) %>% 
  copy_to(sc, ., name="subdf", overwrite=TRUE)

如果您使用Spark 1.x,createOrReplaceTempView应替换为registerTempTable