我遇到了这个错误:
java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to [Ljava.lang.Object;
每当我尝试使用"包含"查找字符串是否在数组中。有没有更合适的方法呢?或者,我做错了什么? (我对Scala相当新鲜)
以下是代码:
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)))
最后一行发生异常。我尝试了几种不同的变体。
我的数据结构是一个List[Tuple2[String, String]]
和一个List[Tuple2[String, Array[String]]]
。我需要从第二个列表中找到包含该字符串的零个或多个匹配项。
由于
答案 0 :(得分:2)
长话短说(还有一部分让我无法在这里*)你使用了错误的类型。 getAs
实施为fieldIndex
(String => Int
),然后是get
(Int => Any
),后跟asInstanceOf
。
由于Spark不使用Arrays
或Sets
而WrappedArray
来存储array
列数据,因此getAs[Array[String]]
或getAs[Set[Row]]
等来电是无效。如果您需要特定类型,则应使用getAs[Seq[T]]
或getAsSeq[T]
并使用toSet
/ toArray
将数据转换为所需类型。
*请参阅Why wrapping a generic method call with Option defers ClassCastException?