لا يمكن إرسال java.lang.String إلى java.lang.Double خطأ عند محاولة إرجاع الخريطة [(سلسلة ، سلسلة) ، (مزدوج ، مزدوج)] من RDD

1

أحاول قراءة ملف .txt مع | المحددات باعتبارها RDD ومحاولة العودة Map[(String, String),(Double, Double)] ، ولكني أواجه CastException

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double

بيانات الإدخال تبدو مثل هذا

string1|string2|100.00|200.00
string1|string2|34.98|0.989

هذه هي الطريقة التي أقرأ بها الملف كـ rdd و تحليله

val mydata = sc
  .textFile("file")
  .map(line => line.split("|"))
  .map(row =>
    ((row(0), row(1)),
     (row(2).asInstanceOf[Double], row(3).asInstanceOf[Double])))
  .collect
  .toMap

كيف يمكنني إصلاح هذه المشكلة

المتوقع س / ع:

Map[(String, String),(Double, Double)] = Map((string1,string2) -> (100.0,200.0), (string1,string2) -> (34.98,0.989))

1 إجابة

2
افضل جواب

لتكون في الجانب الآمن يمكنك استخدامها trim وظيفة ويمكنك استخدامها collectAsMap

val mydata = sc
  .textFile("file")
  .map(line => line.split("\\|"))
  .map(row =>
    ((row(0), row(1)),
      (row(2).trim.asInstanceOf[Double], row(3).trim.asInstanceOf[Double])))
  .collectAsMap()

ولكي تكون أكثر أمانًا يمكنك استخدامه Try/getOrElse

val mydata = sc
  .textFile("file")
  .map(line => line.split("\\|"))
  .map(row =>
    ((row(0), row(1)),
      (Try(row(2).trim.asInstanceOf[Double]).getOrElse(0.0), Try(row(3).trim.asInstanceOf[Double]).getOrElse(0.0))))
  .collectAsMap()

علاوة على ذلك يمكنك استخدامها toDouble بدلا من asInstanceOf[Double]

val mydata = sc
  .textFile("file")
  .map(line => line.split("\\|"))
  .map(row =>
    ((row(0), row(1)), 
      (Try(row(2).trim.toDouble).getOrElse(0.0), Try(row(3).trim.toDouble).getOrElse(0.0)))
  )
  .collectAsMap().foreach(println)
:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام