Scala:具有Seri​​alizable的产品不带参数

时间:2017-03-23 16:19:07

标签: scala apache-spark dataframe spark-dataframe rdd

我的目标是从csv文件中读取数据并将我的rdd转换为scala / spark中的dataframe。这是我的代码:

package xxx.DataScience.CompensationStudy

import org.apache.spark._
import org.apache.log4j._

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

import org.apache.spark.sql.Row
import org.apache.spark.sql.functions.{col, udf}
import org.apache.spark.sql.types._

import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext


object CompensationAnalysis {

  case class GetDF(profil_date:String, profil_pays:String, param_tarif2:String, param_tarif3:String, dt_titre:String, dt_langues:String,
    dt_diplomes:String, dt_experience:String, dt_formation:String, dt_outils:String, comp_applications:String, 
    comp_interventions:String, comp_competence:String)

  def main(args: Array[String]) {

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

    val conf = new SparkConf().setAppName("CompensationAnalysis ")
    val sc = new SparkContext(conf)

    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._


    val lines = sc.textFile("C:/Users/../Downloads/CompensationStudy.csv").flatMap { l => 


      l.split(",") match {

        case field: Array[String] if field.size > 13 => Some(field(0), field(1), field(2), field(3), field(4), field(5), field(6), field(7), field(8), field(9), field(10), field(11), field(12))

        case field: Array[String] if field.size == 1 => Some((field(0), "default value"))

        case _ => None 
      }


    }

在这个问题上,我遇到了错误:带Serializable的产品不带参数

    val summary = lines.collect().map(x => GetDF(x("profil_date"), x("profil_pays"), x("param_tarif2"), x("param_tarif3"), x("dt_titre"), x("dt_langues"), x("dt_diplomes"), x("dt_experience"), x("dt_formation"), x("dt_outils"), x("comp_applications"), x("comp_interventions"), x("comp_competence")))

    val sum_df = summary.toDF()

    df.printSchema


  }

}

这是截图:

enter image description here

请帮忙吗?

1 个答案:

答案 0 :(得分:2)

你应该改进几件事。导致例外的最紧迫问题是,正如@CyrilleCorpet指出的那样,&#34;模式匹配中的三个不同行返回类型Some[Tuple13]Some[Tuple2]None.type的值。那么最小上限是Option[Product with Serializable]符合flatMap的签名(其中结果应该是Iterable[T])模数的一些隐式转换。&#34; < / p>

基本上,如果您有Some[Tuple13]Some[Tuple13]None Some[Tuple2]Some[Tuple2]和{{1你会好起来的。

此外,由于类型擦除,类型上的模式匹配通常是一个坏主意,并且模式匹配对于您的情况来说甚至都不是很好。

因此,您可以在案例类中设置默认值:

None

然后在你的lambda中:

case class GetDF(profile_date: String, 
                 profile_pays: String = "default", 
                 param_tarif2: String = "default", 
                 ...
)

现在,在所有情况下,您都会返回val tokens = l.split if (l.length > 13) { Some(GetDf(l(0), l(1), l(2)...)) } else if (l.length == 1) { Some(GetDf(l(0))) } else { None } 。您可以Option[GetDF] flatMap删除所有RDD并仅保留None个实例。