【问题标题】:elasticsearch-spark indexing error : Cannot handle type Map within Map using ScalaValueWriterelasticsearch-spark 索引错误:无法使用 ScalaValueWriter 处理 Map 中的类型 Map
【发布时间】:2015-08-09 13:44:15
【问题描述】:

我正在尝试使用带有 spark-1.3.1 的 elasticsearch-spark-2.1.0 对 elasticsearch 中的数据进行索引,但出现以下错误:

org.elasticsearch.hadoop.serialization.EsHadoopSerializationException: Cannot handle type [class scala.collection.immutable.Map$Map3] within type [class scala.collection.immutable.Map$Map4], instance [Map(word -> ..., pos -> ...)] within instance [Map(page_title -> ..., full -> ..., tokens -> [Lscala.collection.immutable.Map;@1efb3e9)] using writer [org.elasticsearch.spark.serialization.ScalaValueWriter@200c86fd]

这是我为 spark RDD 编制索引的代码。

val spark = new SparkContext(...)
val filesRDD = spark.wholeTextFiles("hdfs://" + source_dir + "/*", 200)

// val sentenceList: RDD[Map[String, Object with Serializable { .. }]]
val sentenceList = filesRDD.flatMap(file => ...)
  .flatMap { page =>
    page.sentences.map { sentence =>
      Map("page_title" -> page.title,
        "full" -> sentence.map(_.word).mkString(" "),
        "tokens" -> sentence.map { t =>
          Map("word" -> t.word, "pos" -> t.pos)
        }.toArray)
    }
  }

EsSpark.saveToEs(sentenceList, ES_RESOURCE)

为什么我不能在地图中索引地图,我该如何解决? 谢谢。

【问题讨论】:

  • 不知道为什么它不起作用,但作为一种不同方法的想法:您可以尝试创建一个单独的类来保存数据。该类当然应该是可序列化的。

标签: scala apache-spark elasticsearch-hadoop


【解决方案1】:

我终于解决了这个问题。

我只是删除了 Map 中的 .toArray 调用。似乎它无法被库解析。

生成的地图是:

Map("page_title" -> page.title,
    "full" -> sentence.map(_.word).mkString(" "),
    "tokens" -> sentence.map { t =>
      Map("word" -> t.word, "pos" -> t.pos)
    })

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 2019-08-07
    • 1970-01-01
    • 2014-08-10
    • 2018-08-14
    • 2019-08-10
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多