在我的项目中,我正在将数据从MongoDB传输到SparkSQL表以进行基于SQL的查询。但是Spark SQL让我创建了临时文件。当我要查询某些内容时,执行时间非常长,因为数据传输和映射操作会花费太多时间。
那么,我可以减少执行时间吗?我可以创建永久性Spark SQL表吗?我可以使用JDBC查询永久表吗?
我要添加代码和执行时间结果。我正在独立模式下执行所有操作。
package com.mongodb.spark.sql;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;
import org.bson.BSONObject;
import com.mongodb.hadoop.MongoInputFormat;
import com.mongodb.spark.demo.Observation;
import com.mongodb.spark.demo.Sensor;
import scala.Tuple2;
public class SparkSqlMongo {
public static void main(String[] args) {
Configuration conf = new Configuration();
conf.set("mongo.job.input.format", "com.mongodb.hadoop.MongoInputFormat");
conf.set("mongo.input.uri", "mongodb://localhost:27017/test.observations");
Configuration sensConf = new Configuration();
sensConf.set("mongo.job.input.format", "com.mongodb.hadoop.MongoInputFormat");
sensConf.set("mongo.input.uri", "mongodb://localhost:27017/test.sens");
SparkConf sconf = new SparkConf().setMaster("local[2]").setAppName("SQL DENEME").set("nsmc.connection.host",
"mongodb:");
JavaSparkContext sc = new JavaSparkContext(sconf);
SQLContext sql = new SQLContext(sc); …Run Code Online (Sandbox Code Playgroud) 我有项目架构,其中我有各自餐厅的项目详细信息.我必须通过'类型'和'类别'找到特定餐厅和团体的所有项目(类型和类别是项目架构中的字段),我能够按照我的要求对项目进行分组,但我无法获得完整的项目宾语.我的查询:
db.items.aggregate([{
'$match': {
'restaurant': ObjectId("551111450712235c81620a57")
}
}, {
'$group': {
id: {
'$push': '$_id'
}
, _id: {
type: '$type'
, category: '$category'
}
}
}, {
$project: {
id: '$id'
}
}])
Run Code Online (Sandbox Code Playgroud)
我已经看到一种方法,通过将每个字段值添加到组然后投影它.因为我的Item模式中有很多字段,所以我觉得这对我来说不是很好的解决方案,我是否可以获得完整的对象而不是Ids.
我在编写查询时遇到问题,无法检索Story文档中嵌入的Comments数组的最后一个对象.
当我执行db.stories.find()时,我的集合目前看起来像这样:
{
"_id" : ObjectId("55d3a39565698bbc68079e31"),
"author" : "Steven Chen",
"link" : "COCO",
"title" : "COCO",
"date" : ISODate("2015-08-18T21:28:53.629Z"),
"comments" : [
{
"author" : "Steven",
"text" : "Major",
"_id" : ObjectId("55d3a39565698bbc68079e32"),
"date" : ISODate("2015-08-18T21:28:53.632Z")
},
{
"text" : "Canada",
"author" : "Steven",
"_id" : ObjectId("55d3a39a65698bbc68079e33"),
"date" : ISODate("2015-08-18T21:28:58.001Z")
},
{
"text" : "Usa",
"author" : "Steven",
"_id" : ObjectId("55d3a39c65698bbc68079e34"),
"date" : ISODate("2015-08-18T21:29:00.877Z")
}
],
"__v" : 0
}
Run Code Online (Sandbox Code Playgroud)
我想根据Story文档的_id给出的日期检索最后一条评论.
我的代码的上下文是有一个带有注释列表的Story帖子,我想检索最后的注释并使用ajax将其作为JSON发送到我的客户端JS,以便可以使用最新/最新注释更新视图.
在这种情况下,带有"text:"Usa"的评论应该是获取的评论.
有人可以提供正确的方法来做到这一点,如果你能解释原因会更好吗?谢谢!
我从 mongodb 获得了不同的字段值。当我在命令行中运行以下查询时,效果很好。
db.celldata.distinct("tenentId")
我正在使用 Mongo java 3.0 驱动程序,使用以下查询检索不同的值
MongoCursor<String> iterator = coll.distinct("tenantId", String.class).iterator();
当我运行查询时,出现以下异常
org.bson.BsonInvalidOperationException: readString can only be called when CurrentBSONType is STRING, not when CurrentBSONType is NULL.
有没有一个很好的实际例子,说明如何在lodash库中使用_.after方法?
我有以下文件,很少有文件只有bids字段.
采集:
{
"_id" : "PqwSsLb2jsqTycMWR",
"name" : "aaa",
"bids" : [
{
"amount" : NumberInt(450)
}
]
}
{
"_id" : "93EDoQfeYEFk8pyzX",
"name" : "bbb"
}
{
"_id" : "j5wkK5Eagnwuo8Jym",
"name" : "ccc",
"bids" : [
{
"amount" : NumberInt(520)
}
]
}
{
"_id" : "eLaTyM5h5kqA97WQQ",
"name" : "ddd"
}
Run Code Online (Sandbox Code Playgroud)
如果我排序bids.amount : 1得到低于结果
结果:
{
"_id" : "93EDoQfeYEFk8pyzX",
"name" : "bbb"
}
{
"_id" : "eLaTyM5h5kqA97WQQ",
"name" : "ddd"
}
{
"_id" : "PqwSsLb2jsqTycMWR", …Run Code Online (Sandbox Code Playgroud) 我有一个如下的集合
{
"state" : "VIC",
"sites" :
[
{
"name" : "VIC01",
"pes" :
[
{
"id" : "1",
"longname" : "rdnvej300exh0443",
"shortname" : "RVE4-E-043",
"location" : "Exhibition"
},
{
"id" : "2",
"longname" : "rdnvej160pee0343",
"shortname" : "RV3W-E-043",
"location" : "Windsor"
},
{
"id" : "3",
"location" : "my home"
}
],
"partners" :
[
{
"id" : "REACH",
"fnns" : ["N54321R","N24686R","N46818R","N10461R"]
},
{
"id" : "NCS_CORE",
"fnns" : [ "N54320R","N71311R","N35797R","N57919R"]
}
]
},
{
"name" : "CLAYTON",
"pes" …Run Code Online (Sandbox Code Playgroud) 我有一个存储浮点数组的MongoDB数据库。假设采用以下格式的文档集合:
{
"id" : 0,
"vals" : [ 0.8, 0.2, 0.5 ]
}
Run Code Online (Sandbox Code Playgroud)
有一个查询数组(例如具有values)[ 0.1, 0.3, 0.4 ],我想为集合中的所有元素计算距离(例如,差异之和;对于给定的文档和查询,将由计算abs(0.8 - 0.1) + abs(0.2 - 0.3) + abs(0.5 - 0.4) = 0.9)。
我试图使用MongoDB的聚合函数来实现这一点,但是我无法解决如何遍历数组的问题。(我没有使用MongoDB的内置geo操作,因为数组可能很长)
我还需要对结果进行排序并将其限制在前100位,因此不需要读取数据后进行计算。
我目前正在使用 AWS EC2 服务器,并且抓取了一些存储在 MongoDB 集合中的数据。这是我的数据库中唯一的集合。
现在我需要将此集合传输到我的本地计算机上进行处理。我的问题是远程计算机上的剩余磁盘空间不足以转储整个集合。空间可容纳约 60% 的藏品。我尝试使用db.copy()主机db.export()名直接在本地计算机上进行复制,但它不起作用,因为我不在本地网络上,而且即使使用 ssh 隧道,也存在一些身份验证问题。
我想做的是将我的大集合分成 2 个较小的集合并转储每个集合。是否可以?
谢谢你!
我知道这违反了MongoDB及其No-SQL模型的设计,但我试图在一个集合中查找Documents,然后使用结果中的ID字段来查找另一个集合中的相应记录.有效地尝试模拟联接.
//query is irrelevant to question
var results = collectionOne.find(query).limit(limit);
var a = [];
results.forEach(function(r)
{
var aquery = { id : {$eq : r.id}};
collectionTwo.find(aquery).limit(limit).exec(function, b)
{
if (err)
{
res.render('error',
{
status : 500
});
}
else
{
a.push(b);
}
});
});
res.jsonp(a);
Run Code Online (Sandbox Code Playgroud) mongodb ×8
java ×2
mongoose ×2
node.js ×2
amazon-ec2 ×1
apache-spark ×1
javascript ×1
lodash ×1
mapreduce ×1
mongodb-java ×1