具有数百万行的SparkR Shiny renderDT()

时间:2018-11-26 11:22:30

标签: r apache-spark datatables shiny dt

我想在R Shiny中使用this方法(具有数百万行的renderDT()方法)在R Shiny中进行SparkDataFrame(延迟呈现具有数百万行的数据表)。我也希望能够应用全局过滤器或列过滤器。我没有在R中找到执行此操作的任何资源,而且无法在第一个链接处将Ajax转换为R代码。这是我到目前为止的内容:

  

server.R

library(shiny)

# Connect to Spark outside the shinyServer() method
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))
sparkR.session(master = "local[*]")

# Define server logic
shinyServer(function(input, output, session) {

  output$myTable <- renderDT(

    # get the SparkDataFrame from HDFS; collect() converts SparkDataFrame -> data.frame
    collect(read.df(paste("hdfs://localhost:9000", input$path, sep=""), input$type))
  )
})
  

ui.R

library(shiny)
library(DT)

# Define UI for application that draws a data table
shinyUI(fluidPage(

  # Application title
  titlePanel("Simple SparkDataFrame Example"),

  # Sidebar with a text input for the filename 
  sidebarLayout(
    sidebarPanel(
      textInput("path",
                "HDFS File Path:",
                "/big_data/example_SQL/684c9b31-892c-48c5-8574-9dd61a9d7e78.parquet"
      ),
      textInput("type",
                "HDFS File Type:",
                "parquet"
      )
    ),

    # Show the table
    mainPanel(
       dataTableOutput("myTable")
    )
  )
))

我目前遇到的主要问题是renderDT()需要R data.frame,因此我正在使用SparkR的collect()方法读取整个{{1} }进入内存,这远非理想。谁能帮我解决这个问题?

更新0:

我找到了extensions到R DataTables,所以我用垂直滚动条重新格式化了表格,如下所示:

SparkDataFrame

但是我仍在使用 output$myTable <- renderDT( # get the SparkDataFrame from HDFS; collect() converts SparkDataFrame -> data.frame collect(read.df(paste("hdfs://localhost:9000", input$path, sep=""), input$type)), extensions = "Scroller", options=list( deferRender = TRUE, scroller = TRUE, scrollY = 500 # height in pixels ) ) collect()转换为SparkDataFrame,我想避免这种情况。 其他问题:如何在R中启用data.frame

更新1:

我认为它与此处的ajax()方法有关,但是我无法将其转换为R代码或将其解释为R中的JavaScript。

更新2:

经过艰苦的努力,我设法获得了大约80%的jQuery和20%的R的MWE。这重现了this link的行为,但是这样做基本上没有R代码,这不是我想要什么:

scroller.loadingIndicator

0 个答案:

没有答案