Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从MongoDB读取数据,并对Scala Spark连接器中的多级JSON应用过滤器_Json_Scala_Apache Spark - Fatal编程技术网

从MongoDB读取数据,并对Scala Spark连接器中的多级JSON应用过滤器

从MongoDB读取数据,并对Scala Spark连接器中的多级JSON应用过滤器,json,scala,apache-spark,Json,Scala,Apache Spark,我将MongoDb Scala连接器用于Spark。在文件中 这里提到了如何对给定的JSON文档应用过滤器。我无法理解的是,如果我们有一个多级json,并且我们想对其应用过滤器,那么我们将如何访问json文档中的键/值 Json文档: { "_id" : 1, "test" : 1 } { "_id" : 2, "test" : 2 } { "_id" : 3, "test" : 3 } { "_id" : 4, "test" : 4 } { "_id" : 5, "test" : 5 } {

我将MongoDb Scala连接器用于Spark。在文件中

这里提到了如何对给定的JSON文档应用过滤器。我无法理解的是,如果我们有一个多级json,并且我们想对其应用过滤器,那么我们将如何访问json文档中的键/值

Json文档:

{ "_id" : 1, "test" : 1 }
{ "_id" : 2, "test" : 2 }
{ "_id" : 3, "test" : 3 }
{ "_id" : 4, "test" : 4 }
{ "_id" : 5, "test" : 5 }
{ "_id" : 6, "test" : 6 }
val rdd = MongoSpark.load(sc)

val filteredRdd = rdd.filter(doc => doc.getInteger("test") > 5)
println(filteredRdd.count)
println(filteredRdd.first.toJson)
筛选文档:

{ "_id" : 1, "test" : 1 }
{ "_id" : 2, "test" : 2 }
{ "_id" : 3, "test" : 3 }
{ "_id" : 4, "test" : 4 }
{ "_id" : 5, "test" : 5 }
{ "_id" : 6, "test" : 6 }
val rdd = MongoSpark.load(sc)

val filteredRdd = rdd.filter(doc => doc.getInteger("test") > 5)
println(filteredRdd.count)
println(filteredRdd.first.toJson)
多级Json文档

{
    "_id": 1,
    "test": 1,
    "additionalProperties": {
        "value": "35",
        "phone": "566623232"
    }
}
问题陈述:

{ "_id" : 1, "test" : 1 }
{ "_id" : 2, "test" : 2 }
{ "_id" : 3, "test" : 3 }
{ "_id" : 4, "test" : 4 }
{ "_id" : 5, "test" : 5 }
{ "_id" : 6, "test" : 6 }
val rdd = MongoSpark.load(sc)

val filteredRdd = rdd.filter(doc => doc.getInteger("test") > 5)
println(filteredRdd.count)
println(filteredRdd.first.toJson)
我想根据“value”属性进行过滤,但我不知道如何访问它。我试着做以下事情,但它不起作用

val filteredRdd = rdd.filter(doc => doc.getInteger("value") > 5)

val filteredRdd = rdd.filter(doc => doc.getInteger("additionalProperties.value") > 5)  
有人能告诉我如何访问“value”属性吗?正确的语法是什么

我尝试过的其他一些选项:

{ "_id" : 1, "test" : 1 }
{ "_id" : 2, "test" : 2 }
{ "_id" : 3, "test" : 3 }
{ "_id" : 4, "test" : 4 }
{ "_id" : 5, "test" : 5 }
{ "_id" : 6, "test" : 6 }
val rdd = MongoSpark.load(sc)

val filteredRdd = rdd.filter(doc => doc.getInteger("test") > 5)
println(filteredRdd.count)
println(filteredRdd.first.toJson)
根据MongoDB Spark的Scala连接器的官方文档。我尝试使用聚合管道过滤文档。因此以下代码行可以正常工作:

val filterWithPipeline = customRdd.withPipeline(Seq(Document.parse("{ $match: { id: { $eq : '134' } } }")))
但是如果我想使用相同的语法访问“value”项。它不起作用

 val filterWithPipeline = customRdd.withPipeline(Seq(Document.parse("{ $match: { value: { $eq : '134' } } }")))

那么,如何使用相同的方法来查询多级JSON呢?

如果使用dafaframe呢

val df = spark.read.json("path")
这是我的例子,

+---+--------------------+----+
|_id|additionalProperties|test|
+---+--------------------+----+
|1  |[566623232, 35]     |1   |
|2  |[566623232, 35]     |2   |
|3  |[566623232, 1]      |3   |
+---+--------------------+----+
模式是

root
 |-- _id: long (nullable = true)
 |-- additionalProperties: struct (nullable = true)
 |    |-- phone: string (nullable = true)
 |    |-- value: string (nullable = true)
 |-- test: long (nullable = true)
那么

将给出如下结果:

+---+--------------------+----+
|_id|additionalProperties|test|
+---+--------------------+----+
|1  |[566623232, 35]     |1   |
|2  |[566623232, 35]     |2   |
+---+--------------------+----+

这里有几种方法可以读取mongoDB并对其进行过滤 创建SparkSession

val spark = SparkSession.builder().master("local").appName("Test")
  .config("spark.mongodb.input.uri", "mongodb://127.0.0.1/db.collectionName")
  .config("spark.mongodb.output.uri", "mongodb://127.0.0.1/db.CollectionName")
  .getOrCreate

import spark.implicits._
import com.mongodb.spark.sql._
读取为
MongoRDD[Document]
并对其进行过滤

MongoSpark.load(spark.sparkContext).filter(doc => {
  val value = doc.get("additionalProperties").asInstanceOf[Document].get("value")
  value.toString.toInt > 5
})
使用spark.Read.mongo()读取为数据帧

输出:

+---+--------------------+----+
|_id|additionalProperties|test|
+---+--------------------+----+
|2.0|[5, 566623232]      |2.0 |
+---+--------------------+----+

希望这有帮助

非常感谢。但我想将所选文档作为JSON返回。如何从数据帧中实现这一点,以及在scala代码中需要执行哪些导入操作?您也可以突出显示它。
df.write.mode('write').json(yourtargetpath)
您可以为现有文件选择写入或附加模式。可能
import org.apache.spark.sql.Dataset
import org.apache.spark.sql.Row您好,我无法解决第行的错误。以下是我的导入:import org.apache.spark.{SparkConf,SparkContext}import org.apache.spark.sql.{SparkSession,Dataset,Row,Column}import com.mongodb.spark.config.\import com.mongodb.spark.\import scala.collection.JavaConverters.\import org.bson.documents您是否要求只使用RDD或dataframe也可以?