在scala中使用contains - 异常

时间:2016-03-21 14:56:40

标签: scala apache-spark

我遇到了这个错误: 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]]]。我需要从第二个列表中找到包含该字符串的零个或多个匹配项。

由于

1 个答案:

答案 0 :(得分:2)

长话短说(还有一部分让我无法在这里*)你使用了错误的类型。 getAs实施为fieldIndexString => Int),然后是getInt => Any),后跟asInstanceOf

由于Spark不使用ArraysSetsWrappedArray来存储array列数据,因此getAs[Array[String]]getAs[Set[Row]]等来电是无效。如果您需要特定类型,则应使用getAs[Seq[T]]getAsSeq[T]并使用toSet / toArray将数据转换为所需类型。

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