символ rdd должен быть преобразован в фрейм данных

#excel #apache-spark #dataframe #rdd

#excel #apache-spark #фрейм данных #rdd

Вопрос:

Данные RDD должны быть преобразованы во фрейм данных. Но я не могу этого сделать. ToDf не работает, также я пробовал использовать array RDD для преобразования во фрейм данных. Пожалуйста, дайте мне совет.Эта программа предназначена для синтаксического анализа образца Excel с использованием scala и spark

 import java.io.{File, FileInputStream}
import org.apache.poi.xssf.usermodel.XSSFCell
import org.apache.poi.xssf.usermodel.{XSSFSheet, XSSFWorkbook}
import org.apache.poi.ss.usermodel.Cell._
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.types.{ StructType, StructField, StringType, IntegerType };
object excel 
  {
  def main(args: Array[String]) = 
  {
  val sc = new SparkContext(new SparkConf().setAppName("Excel Parsing").setMaster("local[*]"))
  val file = new FileInputStream(new File("test.xlsx"))
  val wb = new XSSFWorkbook(file)
  val sheet = wb.getSheetAt(0)
  val rowIterator = sheet.iterator()
  val builder = StringBuilder.newBuilder
  var column = ""
  while (rowIterator.hasNext()) 
  {
  val row = rowIterator.next();
  val cellIterator = row.cellIterator();
  while (cellIterator.hasNext()) 
  {
  val cell = cellIterator.next();
  cell.getCellType match {
  case CELL_TYPE_NUMERIC ⇒builder.append(cell.getNumericCellValue   ",")
  case CELL_TYPE_BOOLEAN ⇒ builder.append(cell.getBooleanCellValue   ",")
  case CELL_TYPE_STRING ⇒ builder.append(cell.getStringCellValue   ",")
  case CELL_TYPE_BLANK ⇒ builder.append(",")
  }
  }
  column = builder.toString()
  println(column)
  builder.setLength(0)
  }
  val data= sc.parallelize(column)
  println(data)
  }
  }
  

Комментарии:

1. Вы ничего не делаете с Spark в коде, который вы перечислили здесь…

2. О, я не видел этого внизу. В любом случае, @Shivansh Srivastava уже дал вам ответ.

Ответ №1:

Для преобразования Spark RDD в DataFrame . Вы должны сделать sqlContext или sparkSession в соответствии с версией spark, а затем использовать

 val sqlContext=new SQLContext(sc)
    import sqlContext.implicits._
  

Если вы используете Spark 2.0 или выше, используйте вместо этого SparkSession, поскольку SQLContext в новой версии устарел!

 val spark=SparkSession.builder.config(conf).getOrCreate.
import spark.implicits._
  

Это позволит вам использовать toDF в RDD.
Это может решить вашу проблему!

Примечание: Для использования SQLContext вы должны включить spark_sql в качестве зависимости!

Комментарии:

1. Нет, вы должны создать sqlcontext самостоятельно и SparkSession в случае, если вы используете Spark2.0