Я хочу сделать это (лениво визуализировать таблицу данных с миллионами строк) в 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)