Как передать аргументы в Scala Swing Application? - PullRequest
0 голосов
/ 13 мая 2019

ЦЕЛЬ: Я написал небольшое приложение Scala Swing, которое отображает Spark Объект фрейма данных в элементе управления Scala Swing Table.

ВОПРОС:

Я пытался найти информацию о том, как правильно настроить мою программу для передачи аргументов моему объекту приложения с графическим интерфейсом: ViewDF ???

  • У меня есть главный объект под названием: ViewDF, который содержит главную функцию с список аргументов.

  • Если список аргументов содержит ключевое слово --debug, затем назначьте debugBoolean = true

  • Если debugBoolean = true Затем выполните обработку графического интерфейса.

  • В основной функции объекта ViewDf: Я создаю объект пользовательского интерфейса (UI) из класса (UI).

  • В классе (UI) я обрабатываю исходный фрейм данных: и создайте переменную rowData из исходного кадра данных. и создайте переменную coldata из исходного кадра данных.

Я пытаюсь передать 3 параметра в приложение с графическим интерфейсом:

а. параметр отладки. (ложь или истина)

 false - do not execute the GUI processing.

 true - when: the debug option is true. 

        Then: 1.0  Perform the GUI processing.
              1.1  Pass the debug option to the application.
              1.2  Pass the DataFrame object to the application.
              1.3  Pass the Spark Session object to the application. 
              1.4. create the rowData from the source Data Frame.
              1.5  create the colData from the source Data Frame.     
              1.6  create the table object with the rowData and colData
                   as input to the table.

б. параметр объекта сеанса Spark. (искра = искра)

 This parameter is specified inside my main program
 where the viewDF object is created. 

с. имя объекта фрейма Spark. (srcDF = DF)

 This parameter is specified inside my main program
  where the viewDF object is created. 

1.0 Когда запускается моя основная программа SCALA и вызывается SPARK-SUBMIT: ================================== ===================================

1.1 Внутри моей программы Main Scala я бы позвонил в ViewDF после того, как я создаю кадр данных искры (DF).

 EXAMPLE:  

 1.  CREATE THE SPARK DATA FRAME.

     var DF:DataFrame=spark.read
     .format("com.databricks.spark.csv")
     .option("header","true")
     .option("inferschema","true")
     .option("delimiter",",")
     .load("FILE:///home/vneto/test.csv")

 2.  DISPLAY A DATA FRAME TO A GUI TABLE 
     ONLY WHEN ( debug=true && **--deploy-mode CLIENT** )    

     val viewRC = new ViewDF( debug=debug,spark=spark,srcDF=DF)

2.0 КОГДА РАБОТАЕТ В РЕЖИМЕ ИСКЛЮЧЕНИЯ: =================================

2.1 Передайте ключевое слово <--debug> в программу Main Scala от звонка Spark-Submit.

 This statement is placed after the application jar file.

 When:  --debug keyword is found in the args list, 

 Then:  assign the variable debugBoolean = true.  

2.2 Параметр указывается внутри главной шкалы программа, в которой создается объект viewDF.

 See Item:  2.4

2.3 Параметр должен быть указан внутри основного Scala-программа, в которой создается объект ViewDF.

 See item:  2.4) 

2.4 Объект ViewDF создается после создания фрейма данных.

 val viewRC = new ViewDF( debug=debug,spark=spark,srcDF=DF)

3.0 КОГДА РАБОТАЕТ В РЕЖИМЕ ОГНЯ:
================================

3.1 ИМПОРТ МОДУЛЕЙ СКАЛА.

 import org.apache.spark.sql.DataFrame
 import com.databricks.spark.csv
 import com.company.viewDF

3.2 СОЗДАНИЕ КАДРОВЫХ ДАННЫХ, КОТОРЫЕ ЧИТАЕТ ФАЙЛ CSV.

 var DF:DataFrame=spark.read
     .format("com.databricks.spark.csv")
     .option("header","true")
     .option("inferschema","true")
     .option("delimiter",",")
     .load("FILE:///home/vneto/test.csv")

3.3 Оператор PLACE THE (viewDF) после оператора spark.read.

 val viewDF = new ViewDF( debug=debug, spark=spark, srcDF=DF)

КОД СКАЛА:

import org.apache.hadoop.fs.DF
import org.apache.spark.sql.{DataFrame, SparkSession}
import scala.swing._


//===================================================================
// OBJECT: ViewDF - View a scala spark Data Frame.
//===================================================================

object ViewDF {

  // ================================================================
  // function: main 
  // ================================================================

  def main ( args : Array[String] ) {

      // ------------------------------------------------------------
      // step 01.   INITIALIZE debug-Boolean VARIABLE AS:  false.
      // ------------------------------------------------------------

      var debugBoolean = false

      // ------------------------------------------------------------
      // step 02.   GET SPARK-SUBMIT COMMAND LINE OPTION:  --debug
      // ------------------------------------------------------------

      for ( s <- args ) {
          if  ( s == "--debug" ) {
              debugBoolean = true
          } 
      }


      // -------------------------------------------------------------
      // step 03.  CREATE TOP MAIN FRAME WINDOW OBJECT.
      //
      //           1. pass the debug option to the interface.
      //           2. pass the spark session object to the interface.
      //           3. pass the data frame object to the interface.  
      // -------------------------------------------------------------

      val     top     =   new  UI ( 
              debug   =   debugBoolean 
      )

      // -------------------------------------------------------------
      // step 04.   DISPLAY TOP MAIN FRAME WINDOW to USER.
      // -------------------------------------------------------------

      top.visible = true

      // -------------------------------------------------------------
      // step 05.   DISPLAY MESSAGE AT THE END OF THE MAIN FUNCTION.
      // -------------------------------------------------------------

      println("end of main function")

  } // END OF:    main

} // END OF:        viewDF


//===================================================================
//
// Define class:    UI   -     USER INTERFACE
//
// PURPOSE:     1.  This UI class defines the User Interface.
//
// ------------------------------------------------------------------
//
// Attributes:  1.  spark   =   Passes a Spark Session to the interface. 
//
//                              Default:    ???
//
//              2.  debug   =   Passes a debug switch to the interface.  
//
//                              Default:   false - turn interface off. 
//                                         true  - turn interface on.
//
//              3.  srcDF   =   Passes a source data frame to the 
//                              interface. 
//                              Default:    ???
//
// ===================================================================

class UI (
      spark : SparkSession    = ??? ,
      srcDF : DataFrame       = ??? ,
      debug : Boolean         = false
) extends MainFrame {

// -------------------------------------------------------------------
// step 200.   if debug = true then display user interface.
// -------------------------------------------------------------------

if  ( debug ) {

    // ---------------------------------------------------------------
    // s-201.  ASSIGN A TITLE TO THE TOP WINDOW.
    // ---------------------------------------------------------------

    title           = "GUI 1 Data Frame Viewer"

    // ---------------------------------------------------------------
    // s-202.  ASSIGN THE PREFERRED SIZE OF THE TOP WINDOW.
    // ---------------------------------------------------------------

    preferredSize   = new Dimension(400,400)

    // ---------------------------------------------------------------
    // s-203.  ASSIGN SOURCE DATA FRAME TO A MUTABLE OUTPUT DATA FRAME.
    // ---------------------------------------------------------------

    var        outDF   =   srcDF

    // ---------------------------------------------------------------
    // s-204.  GET THE DATA FRAME SCHEMA FROM THE SOURCE DATA FRAME. 
    //
    //         attributes: name - dataType
    // ---------------------------------------------------------------

    val        DFS    =   srcDF.schema

    // ---------------------------------------------------------------
    // s-205.  Converts all elements of the outDF Data Frame 
    //         into a string data type format 
    //         looping over the columns of the data frame schema (DFS).
    // ---------------------------------------------------------------

    DFS.foreach( row => {

        if  ( row.dataType != "StringType" ) {
            import spark.implicits._ ;
            outDF = outDF.withColumn(
                    s"${row.name}", 
                    $"${row.name}".cast("String")
                    );
        } // end of outDF String Conversion.
        println( row.name + " " + row.dataType + " " );
    }) // end of DFS Schema Column Name For Loop.

    // ----------------------------------------------------------------
    // s-206.  prints the schema of the output data frame
    //         to the log after the string conversion.
    // ----------------------------------------------------------------

    outDF.printSchema ;

    // ----------------------------------------------------------------
    // s-207.  Converts the outDF Data Frame into an Array of Arrays.
    //
    //         The rowData variable is passed to the scala swing table.  
    // ----------------------------------------------------------------

    val rowData   =   outDF.collect().map( row => {

        var     a = Array[Any]() ;
        for ( i <- 0 to row.size -1 )   { a = a :+ row.getString(i); };
        a ;

    }) // END OF CONVERSION OF THE DATA FRAME INTO AN ARRAY OF ARRAYS.

    // ----------------------------------------------------------------
    // s-208.  CREATES THE HEADER COLUMN NAME SEQUENCE ARRAY.
    //         * list of column names.
    // ----------------------------------------------------------------

    val      colData     =   srcDF.columns

    // ----------------------------------------------------------------
    // s-209.  CREATES THE USER INTERFACE OBJECT( ui ).
    //
    // NOTE:    1.  Creates a new Vertical Box Panel as:    
    //              ui = User Interface Object.
    //
    //          2.  Creates a new Table object 
    //              with input rowData and colData objects.
    //
    //          3.  Creates a new Scroll Pane with the table added.
    // ----------------------------------------------------------------

    lazy val    ui          =   new BoxPanel (Orientation.Vertical) {

         val    table       =   new Table( rowData , colData ) ;

                contents    +=  new ScrollPane( table ) ;

    }   // End of User Interface - Box Panel object.

    // ----------------------------------------------------------------         
    // s-201.  LOADS THE USER INTERFACE OBJECT INTO THE CONTENTS OBJECT.
    // ----------------------------------------------------------------

    contents    =   ui

    // ----------------------------------------------------------------
    // s-211.  Turn on visibility of the top window 
    //         to the user on the client machine.
    // ----------------------------------------------------------------

    visible     =   true

} // END OF BLOCK:  If debug == true Then Display User Interface.

} // КОНЕЦ КЛАССА: UI

...