文本文件的spark Row.fromSeq出错

时间:2018-03-02 13:04:56

标签: scala apache-spark

import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark._
import org.apache.spark.sql.types._
import org.apache.spark.sql._

object fixedLength {

  def main(args:Array[String]) {

    def getRow(x : String) : Row={    
    val columnArray = new Array[String](4)
    columnArray(0)=x.substring(0,3)
    columnArray(1)=x.substring(3,13)
    columnArray(2)=x.substring(13,18)
    columnArray(3)=x.substring(18,22)
    Row.fromSeq(columnArray)  
  }

    Logger.getLogger("org").setLevel(Level.ERROR)

    val spark = SparkSession.builder().master("local").appName("ReadingCSV").getOrCreate()


    val conf = new SparkConf().setAppName("FixedLength").setMaster("local[*]").set("spark.driver.allowMultipleContexts", "true");
    val sc = new SparkContext(conf)    
    val fruits = sc.textFile("in/fruits.txt")

    val schemaString = "id,fruitName,isAvailable,unitPrice";
    val fields = schemaString.split(",").map( field => StructField(field,StringType,nullable=true))
    val schema = StructType(fields)

    val df = spark.createDataFrame(fruits.map { x => getRow(x)} , schema)
    df.show() // Error
    println("End of the program")
  }
}

我在df.show()命令中遇到错误。 我的文件内容是

56 apple     TRUE 0.56
45 pear      FALSE1.34
34 raspberry TRUE 2.43
34 plum      TRUE 1.31
53 cherry    TRUE 1.4 
23 orange    FALSE2.34
56 persimmon FALSE23.2
  

ERROR执行程序:阶段0.0(TID 0)中任务0.0的异常   java.lang.ClassCastException:org.apache.spark.util.SerializableConfiguration无法强制转换为[B       在org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:81)

你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

您正在以旧方式<system.webServer> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <!--<remove name="OPTIONSVerbHandler" /> --> <remove name="TRACEVerbHandler" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer>

创建rdd
SparkContext(conf)

而您使用val conf = new SparkConf().setAppName("FixedLength").setMaster("local[*]").set("spark.driver.allowMultipleContexts", "true"); val sc = new SparkContext(conf) val fruits = sc.textFile("in/fruits.txt")

以新方式创建dataframe
SparkSession

最终,您将使用旧val spark = SparkSession.builder().master("local").appName("ReadingCSV").getOrCreate() val df = spark.createDataFrame(fruits.map { x => getRow(x)} , schema) 功能创建的rdd与使用新sparkContext创建的dataframe混合。

我建议你只使用一种方式。

我猜这就是问题的原因

<强>更新

执行以下操作应该适合您

sparkSession