Apache spark 如何优化巨型spark dataframe SQL查询以比较spark流式RDD中的值?

Apache spark 如何优化巨型spark dataframe SQL查询以比较spark流式RDD中的值?,apache-spark,dataframe,spark-streaming,apache-spark-sql,Apache Spark,Dataframe,Spark Streaming,Apache Spark Sql,我正在创建一个使用spark SQL(数据帧)和spark流的演示。我不是火花专家,所以我需要一些帮助 我从一个DB中加载了大约100万个对象到spark Dataframe,并进行SQL查询,以匹配一些字段和spark streaming中的实时数据 比如说, SELECT * FROM Person WHERE Person.name='stream.name' AND Person.age='stream.age' AND ... etc stream.xxx是一个java字符串,我从s

我正在创建一个使用spark SQL(数据帧)和spark流的演示。我不是火花专家,所以我需要一些帮助

我从一个DB中加载了大约100万个对象到spark Dataframe,并进行SQL查询,以匹配一些字段和spark streaming中的实时数据

比如说,

SELECT *
FROM Person
WHERE Person.name='stream.name' AND Person.age='stream.age' AND ... etc
stream.xxx是一个java字符串,我从spark streaming RDD提取到一个字符串中

现在的问题是,对于100万行和几列的数据帧,上面的SQL查询可能需要一些时间来执行,即使DF被持久化在内存中。我有一个想法,将Person表分解为邮政编码区域(每个数据帧包含来自1个区域的Person),并处理每个数据帧上的每个spark流RDD。这将减少查询时间并使事情更快

我不知道我将如何做分区虽然。下面是一些示例代码

// Setup Spark Stream with receiver
JavaReceiverInputDStream<String> transaction = jssc.receiverStream(new TransactionStreamReceiver(StorageLevel.MEMORY_AND_DISK()));

DataFrame person1 = //load logic ommitted
DataFrame person2 = //load logic ommitted
DataFrame person3 = //load logic ommitted

// Break up Person table for faster processing
transaction.foreachRDD(new TransactionProcessingFunction(person1, sqlContext, window,1));

transaction.foreachRDD(new TransactionProcessingFunction(person2, sqlContext, window,2));

transaction.foreachRDD(new TransactionProcessingFunction(person3, sqlContext, window,2));
//使用接收器设置火花流
javaReceiveInputdStream事务=jssc.receiveStream(新的TransactionStreamReceiver(StorageLevel.MEMORY_和_DISK());
DataFrame person1=//加载逻辑ommitted
DataFrame person2=//加载逻辑ommitted
DataFrame person3=//加载逻辑未写入
//分解人员表以加快处理速度
foreachRDD(新的TransactionProcessingFunction(person1,sqlContext,window,1));
foreachRDD(新的TransactionProcessingFunction(person2,sqlContext,window,2));
foreachRDD(新的TransactionProcessingFunction(person3,sqlContext,window,2));
我假设每个工作节点都将处理foreachRDD方法,但事实并非如此。有没有办法让每个工人并行运行每个foreachRDD


编辑:TransactionProcessingFunction类本质上只是一个forloop,它在流数据中循环,执行上面的查询并显示一些结果。

我将尝试获得necromancer银牌,指导您查看如何在流中加载SQL表。创建表对象后,您可以
repartition()
rdd,或者干脆让Spark环境完成它的工作。

您需要输出中的所有列吗?我需要大约6列,我使用*是因为我不想全部键入:如果您不需要所有列,最好通过具体的方式提前筛选。但是您仍然有100万行,这仍然是一个很大的比较。我正在寻找一种方法来并行化Persons表的各个部分,spark应该能够做到这一点,我只是不知道怎么做。