SparkR Shiny renderDT () с миллионами строк - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу сделать это (лениво визуализировать таблицу данных с миллионами строк) в R Shiny, используя метод renderDT() с 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() для считывания всего SparkDataFrame в память, чтодалеко от идеала.Может кто-нибудь помочь мне разобраться с этим?

Обновление 0:

Я нашел extensions в R DataTables, поэтому я переформатировал таблицу с помощью вертикальной полосы прокрутки, как это:

  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 в data.frame, которого я хочу избежать. Дополнительный вопрос : как включить scroller.loadingIndicator в R?

Обновление 1:

Я думаю, что это как-то связано с ajax () метод здесь, но я не могу перевести это в код R или интерпретировать его как JavaScript внутри R.

Обновление 2:

После долгих попыток мне удалось получитьMWE, что составляет около 80% jQuery и 20% R. Это воспроизводит поведение на этой ссылке , но это делается практически без R-кода, а это не то, что я хочу:

library(shiny)

exscript <-
" $(document).ready(function() {
    $('#example').DataTable( {
      serverSide: true,
      ordering: false,
      searching: false, 
      ajax: function ( data, callback, settings ) {
        var out = [];

        for ( var i=data.start, ien=data.start+data.length ; i<ien ; i++ ) {
          out.push( [ i+'-1', i+'-2', i+'-3', i+'-4', i+'-5' ] );
        }

        setTimeout( function () {
          callback( {
            draw: data.draw,
            data: out,
            recordsTotal: 5000000,
            recordsFiltered: 5000000
          } );
        }, 50 );
      },
      dom: 'rtiS',
      scrollY: 200,
      scroller: {
        loadingIndicator: true
      }
    } );
  } );"

minTable <-
" <table id='example'>
    <thead>
      <tr>
        <td>var1</td>
        <th>var2</th>
        <th>var3</th>
        <td>var4</td>
        <th>var5</th>
      </tr>
    </thead>
  </table>
"

ui <- fluidPage(
  tags$head(tags$script(src="http://infra.clarin.eu/content/libs/DataTables-1.10.6/media/js/jquery.js")),
  tags$head(tags$script(src="http://infra.clarin.eu/content/libs/DataTables-1.10.6/media/js/jquery.dataTables.js")),
  tags$head(tags$script(src="http://infra.clarin.eu/content/libs/DataTables-1.10.6/extensions/Scroller/js/dataTables.scroller.js")),
  tags$head(tags$script(HTML(exscript), type='text/javascript', language='javascript')),
  HTML(minTable)
)

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

shinyApp(ui=ui, server=server)
...