2016-03-21 22 views
0

Ben bu sorunu yaşamaya devam ediyorum: bir dize dizisi içinde olup olmadığını java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to [Ljava.lang.Object; Ben kullanmayı deneyin her "içerir" bulmak için. Bunu yapmanın daha uygun bir yolu var mı? Yoksa yanlış bir şey mi yapıyorum?scala de içerdiği - istisna

val matches = Set[JSONObject]() 
val config = new SparkConf() 
val sc = new SparkContext("local", "SparkExample", config) 
val sqlContext = new org.apache.spark.sql.SQLContext(sc) 

val ebay = sqlContext.read.json("/Users/thomassquires/Downloads/products.json") 
val catalogue = sqlContext.read.json("/Users/thomassquires/Documents/catalogue2.json") 

val eins = ebay.map(item => (item.getAs[String]("ID"), Option(item.getAs[Set[Row]]("itemSpecifics")))) 
    .filter(item => item._2.isDefined) 
    .map(item => (item._1 , item._2.get.find(x => x.getAs[String]("k") == "EAN"))) 
    .filter(x => x._2.isDefined) 
    .map(x => (x._1, x._2.get.getAs[String]("v"))) 
    .collect() 

    def catEins = catalogue.map(r => (r.getAs[String]("_id"), Option(r.getAs[Array[String]]("item_model_number")))).filter(r => r._2.isDefined).map(r => (r._1, r._2.get)).collect() 

    def matched = for(ein <- eins) yield (ein._1, catEins.filter(z => z._2.contains(ein._2))) 

istisna son satırında oluşur: Burada

kodudur (I Scala için oldukça yeni). Birkaç farklı varyantı denedim.

Veri yapığım bir List[Tuple2[String, String]] ve bir List[Tuple2[String, Array[String]]]. Dizeyi içeren ikinci listeden sıfır veya daha fazla eşleşme bulmam gerekiyor.

Teşekkür

+0

filtreleyeceğinizi sonra toplama ve herhangi özel bir sebebi var mı görüyor musunuz? Çünkü ideal olarak her zaman sonucunuzu toplamanız gerekir. –

+0

Özellikle hatayı düzeltmek için. Tembelliğinden bu yana sadece topladığı hatayı alıyorum. İlk iki sette hataları göz ardı etmek istedim –

+0

Tüm valların açıklayıcı tiplerini deneyin, aynı zamanda başkalarının kodunuz hakkında akıl yürütmesine yardımcı olur. Btw neden 'eşleştirildi' ve 'catEins'' val's yerine def's? –

cevap

2

Uzun hikaye yanlış türleri kullanılırken (* Beni burada eludes kısmı hala vardır) kısa. getAs, fieldIndex (String => Int) ve ardından get (Int => Any) ve ardından asInstanceOf uygulanmıştır. getAs[Array[String]] veya getAs[Set[Row]] geçerli olmayan gibi

Spark array sütun verilerini saklamak için Arrays ne de Sets ama WrappedArray kullanmadığı için, çağırır. Belirli türler istiyorsanız, getAs[Seq[T]] veya getAsSeq[T] kullanın ve verilerinizi toSet/toArray ile istediğiniz türe dönüştürün.


* Why wrapping a generic method call with Option defers ClassCastException?