elasticsearch,apache-spark,Scala,Types,elasticsearch,Apache Spark" /> elasticsearch,apache-spark,Scala,Types,elasticsearch,Apache Spark" />

Scala Spark&x2B;ElasticSearch返回RDD[(String,Map[String,Any])。我怎样才能操纵任何人?

Scala Spark&x2B;ElasticSearch返回RDD[(String,Map[String,Any])。我怎样才能操纵任何人?,scala,types,elasticsearch,apache-spark,Scala,Types,elasticsearch,Apache Spark,Scala 2.10.4 ElasticSearch 1.4.4 火花1.3 Elasticsearch hadoop 2.1.0.Beta3 按照以下步骤,我可以从ES文档创建rdd,如下所示: val data sc.edRDD('indexName/type') 这将返回类型为的元组的RDD (String, Map[String, Any]) 其中字符串是文档id,映射表示具有fieldname:String->fieldvalue:Any的ES文档。但是因为值类型是Any,所以我无

Scala 2.10.4

ElasticSearch 1.4.4

火花1.3

Elasticsearch hadoop 2.1.0.Beta3

按照以下步骤,我可以从ES文档创建rdd,如下所示:

val data sc.edRDD('indexName/type')
这将返回类型为的元组的RDD

(String, Map[String, Any])
其中字符串是文档id,映射表示具有fieldname:String->fieldvalue:Any的ES文档。但是因为值类型是Any,所以我无法对数据进行太多操作。如果我想的话

data.first()._2.get("someField")
比如说,字段值是ES中的一个双精度值,但它是Spark中的任意值。如果我打印这个值

Buffer(61.15)
尝试使用.asInstanceOf[Double]、.toDouble或这些组合强制转换它会产生以下异常:

java.lang.ClassCastException: scala.collection.convert.Wrappers$JListWrapper cannot be cast to java.lang.Double

在这种简单的情况下,操作数据的正确方法是什么?更糟糕的是,我想要的数据实际上存在于一个嵌套文档中,这意味着原始映射中的任何类型值本身就是一个映射[String,Any],这些类型值有时是数字,有时是元组列表,具体取决于键。

您看到的问题是因为返回的是类型,而不是双精度

如果将其强制转换为缓冲区,则不会得到类强制转换异常。例如,在ES中为以下文档编制索引:

{
    "myDouble" : 4.20,
    "myString" : "test",
    "myList" : [1.2, 93.2, 42.3]
}
然后从spark查询:

val documents = sc.esRDD("test/test", "?q=*")
val doc = documents.first()._2

println(doc.get("myDouble").get.asInstanceOf[Double]) # 4.2
println(doc.get("myString").get.asInstanceOf[String]) # test

import scala.collection.mutable.Buffer

println(doc.get("myList").get.asInstanceOf[Buffer[Double]]) 
# Buffer(1.2, 93.2, 42.3)

println(doc.get("myList").get.asInstanceOf[Buffer[Double]].mkString(","))
# 1.2,93.2,42.3

如果您碰巧在文档中存储了原始的
\u源代码
,那么您可以从每个映射中获取
\u源代码
,它始终是一个字符串,然后自己将其解析为一个真正的全类型模型类。您可以在一个
map
操作中将您从
(String,map[String,Any])
带到
T
,其中
T
是您的模型类类型。只是一个想法,但它可能会起作用。我可以确信,源字符串中的字段总是以指定的顺序(看起来是字母顺序)出现吗?我不知道这些字段的顺序保证,但是如果使用json解析器,比如say Jackson,它不应该关心字段的顺序,这是一个非常好的答案。我想补充一点,在这里构建一个方便的方法getFromDoc[T](doc,key)可能很有用。