如何在闪亮的反应环境中从sparklyr收集数据?

时间:2018-06-13 19:02:15

标签: r apache-spark shiny sparklyr

我无法在闪亮的反应环境中从sparklyr(在远程火花群上)收集数据(用于绘图)。我可以手动运行所有代码(例如在rstudio或r控制台会话中),如果我运行相同的代码片段来收集闪亮但在反应性上下文之外的数据,它可以正常工作。

这是ui.R文件:

library(shiny)
library(shinythemes)

shinyUI(fluidPage(theme=shinytheme("darkly"),

titlePanel(HTML("Spark test")),

sidebarLayout(
  sidebarPanel(
      selectInput("symbol",h4("Select symbol"),choices=c("")),
      actionButton("doclick","Plot")
  ),

mainPanel(
    tags$head(tags$style("#testplot{height:85vh !important;}")),
   plotOutput("testplot")
)
  )
))

server.R文件如下:

library(shiny)
library(dplyr)

server<-function(input, output, session) {

  source("sparktest.R")
  sc<<-connectToSpark()
  tdf<<-loadData()
  symlist<<-as.character(tdf %>% distinct(Sym) %>% pull()) 

  updateSelectInput(session,"symbol",choices=sort(as.character(symlist)))
  plotsym<-reactiveVal(0)

  #plotdf<-tdf %>% filter(Sym=="AA") %>% 
  #  group_by(pdate) %>% summarise(dct=n()) %>% select(pdate,dct) %>%
  #  collect

  observeEvent(input$doclick,
  {
     plotsym(input$symbol)      
     output$testplot <- renderPlot({
      #plotTest2(plotdf)
      plotTest(tdf,plotsym())
    })
   })


 on.exit(spark_disconnect_all())
}

最后,sparktest.R文件的相关部分是

plotTest<-function(df,symbol) {
  plotdf<-df %>% filter(Sym==symbol) %>% 
  group_by(pdate) %>% summarise(dct=n()) %>% select(pdate,dct) %>%
  collect

  p1<-plotdf %>% ggplot(aes(x=pdate))+
  geom_line(aes(y=dct))
  ylab("Day count")
  p1    
}

plotTest2<-function(df) {
  p1<-df %>% ggplot(aes(x=pdate))+
  geom_line(aes(y=dct))
  ylab("Day count")
  p1    
}

与spark的连接很好,ui为股票代码提供了一个简单的选择器。选中后,将对该符号过滤火花数据,并生成一个简单的每日计数图。一切都很好地手动运行,但是当通过闪亮运行时,该过程失败。失败发生在plotTest中管道的“collect”部分。这是追溯:

Warning: Error in writeBin: invalid connection
Stack trace (innermost first):
126: writeBin
125: core_invoke_method
124: invoke_method.spark_shell_connection
123: invoke_method
122: invoke.shell_jobj
121: invoke
120: spark_version
119: create_hive_context.spark_shell_connection
118: create_hive_context
117: hive_context
116: invoke
115: .local
114: dbSendQuery
113: dbSendQuery
112: db_collect.DBIConnection
111: db_collect
110: collect.tbl_sql
109: collect
108: function_list[[k]]
107: withVisible
106: freduce
105: _fseq
104: eval
103: eval
102: withVisible
101: %>%
100: plotTest
 99: renderPlot [/home/rubedo/ShinyApps/sparktest/server.R#36]
 89: <reactive:plotObj>
 78: plotObj
 77: origRenderFunc
 76: output$testplot
  1: runApp

如果我尝试按照“收集”的方式做任何事情都会出现同样的结果,无论是“拉”还是“as_tibble”....任何试图将火花表减少到简单非懒惰的东西数据集。

在服务器代码中,如果我改为使用注释掉的部分,我在observeEvent之外进行过滤,然后在observeEvent中对过滤后的数据进行绘图,那么一切都很好。但是一旦我尝试进行过滤并随后在反应性上下文中“收集”,它就会失败。

在反应式上下文中尝试执行此集合之间是否存在根本的不兼容性?或者是否需要使用不同的方法?我注意到我已尝试通过dbGetQuery直接执行sql,但也失败了。试图将懒惰对象转换为反应性上下文中的非惰性对象的任何东西都失败了。

感谢任何帮助。

0 个答案:

没有答案