繁体   English   中英

具有数组和映射数据类型的 Spark Scala 案例类

[英]Spark Scala case class with array and map datatype

我有这样的数据:

[Michael, 100, Montreal,Toronto, Male,30, DB:80, Product:DeveloperLead]
[Will, 101, Montreal, Male,35, Perl:85, Product:Lead,Test:Lead]
[Steven, 102, New York, Female,27, Python:80, Test:Lead,COE:Architect]
[Lucy, 103, Vancouver, Female,57, Sales:89,HR:94, Sales:Lead]

所以我必须读取这些数据并使用 Spark 定义一个案例类。 我已经编写了以下程序,但是在将案例类转换为数据框时出现错误。 我的代码有什么问题,我该如何纠正?

case class Ayush(name: String,employee_id:String ,work_place: Array[String],sex_age: Map [String,String],skills_score: Map[String,String],depart_title: Map[String,Array[String]])

我在下面的行中收到一个错误(见下图):

val d = df.map(w=> Ayush(w(0),w(1),w(2)._1,w(2)._2,w(3)._1,w(3)._2,w(4)._1,w(4)._2,w(5)._1,w(5)._2._1,w(5)._2._2))).toDF

在此处输入图片说明

我已经更改了您的数据。 将工作场所和部门数据用双引号括起来,以便我可以使用逗号分隔值获取数据。 然后添加一个自定义分隔符,以便稍后我可以使用分隔符来分隔数据。 您可以使用自己的分隔符。 图像如下:

在此处输入图片说明

数据如下:

迈克尔,100,“蒙特利尔,多伦多”,男,30,DB:80,“产品,开发主管”威尔,101,蒙特利尔,男,35,Perl:85,“产品,主管,测试,主管”史蒂文,102,纽约,女性,27,Python:80,“测试,领导,COE,建筑师” Lucy,103,温哥华,女性,57,销售:89_HR:94,“销售,领导”

以下是我执行的代码更改,对我来说效果很好:

val df = spark.read.csv("CSV PATH HERE")
case class Ayush(name: String,employee_id:String ,work_place: Array[String],sex_age: Map [String,String],skills_score: Map[String,String],depart_title: Map[String,Array[String]])
val resultDF = df.map { x => {
       val departTitleData = x(6).toString
       val skill_score = x(5).toString
       val skill_Map = scala.collection.mutable.Map[String, String]()
       // Separate skill by underscore I can get each skill:Num then i will add each one in map
      skill_score.split("_").foreach { x => skill_Map += (x.split(":")(0) -> x.split(":")(1)) }
// Putting data into case class
     new Ayush(x(0).toString(), x(1).toString, x(2).toString.split(","), Map(x(3).toString -> x(4).toString), skill_Map.toMap, Map(x(6).toString.split(",")(0) -> x(6).toString.split(",")) )
}}
//End Here

上面的代码输出是:

================================================== ==============================

+-------+-----------+--------------------+------------------+--------------------+--------------------+
|   name|employee_id|          work_place|           sex_age|        skills_score|        depart_title|
+-------+-----------+--------------------+------------------+--------------------+--------------------+
|Michael|        100|[ Montreal, Toronto]|  Map( Male -> 30)|      Map( DB -> 80)|Map( Product -> W...|
|   Will|        101|         [ Montreal]|  Map( Male -> 35)|    Map( Perl -> 85)|Map( Product -> W...|
| Steven|        102|         [ New York]|Map( Female -> 27)|  Map( Python -> 80)|Map( Test -> Wrap...|
|   Lucy|        103|        [ Vancouver]|Map( Female -> 57)|Map(HR -> 94,  Sa...|Map( Sales -> Wra...|
+-------+-----------+--------------------+------------------+--------------------+--------------------+
  • 它可能不像您所期望的那样,但它可能会帮助您实现您正在尝试做的事情......

@vishal我不知道这个问题是否仍然有效,但这是我不更改源数据的解决方案,公平警告它可能有点令人讨厌:)

def main(args:Array[String]):Unit= {

    val conf=new SparkConf().setAppName("first_demo").setMaster("local[*]")
    val sc=new SparkContext(conf)
   val spark=SparkSession.builder().getOrCreate()
    import spark.implicits._
    val rdd1=sc.textFile("file:///C:/Users/k.sandeep.varma/Downloads/documents/documents/spark_data/employee_data.txt")
    val clean_rdd=rdd1.map(x=>x.replace("[","")).map(x=>x.replace("]",""))
   val schema_rdd=clean_rdd.map(x=>x.split(", ")).map(x=>schema(x(0),x(1),x(2).split(","),Map(x(3).split(",")(0)->x(3).split(",")(1)),Map(x(4).split(":")(0)->x(4).split(":")(1)),Map(x(5).split(":")(0)->x(5).split(":"))))
    val df1=schema_rdd.toDF()
    df1.printSchema()
  df1.show(false)

输出:

|name   |employee_id|work_place         |sex_age       |skills_score    |depart_title                           |
+-------+-----------+-------------------+--------------+----------------+---------------------------------------+
|Michael|100        |[Montreal, Toronto]|[Male -> 30]  |[DB -> 80]      |[Product -> [Product, DeveloperLead]]  |
|Will   |101        |[Montreal]         |[Male -> 35]  |[Perl -> 85]    |[Product -> [Product, Lead,Test, Lead]]|
|Steven |102        |[New York]         |[Female -> 27]|[Python -> 80]  |[Test -> [Test, Lead,COE, Architect]]  |
|Lucy   |103        |[Vancouver]        |[Female -> 57]|[Sales -> 89,HR]|[Sales -> [Sales, Lead]]               |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM