我的目标是从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
}
}
这是截图:
请帮忙吗?
答案 0 :(得分:2)
你应该改进几件事。导致例外的最紧迫问题是,正如@CyrilleCorpet指出的那样,"模式匹配中的三个不同行返回类型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
个实例。