我正在使用Spark 2.4.0和Scala 2.11。 当用户包含:(country,id,url)时,我有Dataset [Users]。 我想将此DS按国家/地区分组,对于每个分组, 请求URL,以获取有关该国家/地区用户的详细信息。
什么是最好的方法? 使用mapPartitions? foreachPartition? 谢谢
答案 0 :(得分:0)
mapPartitions和foreachPartitition用于RDD。现在,数据集也可以使用mapPartitions。
通常,您应该在数据框或数据集上使用Spark DSL-或Spark SQL API。这些使用Catalyst Optimizer意味着需要做的事情更少,并且还可以并行运行。数据框的示例类似于DataSet:
SELECT
*
FROM users u
WHERE EXISTS (
SELECT
NULL
FROM sessions s
WHERE s.user_id <> 1234
AND u.id = s.user_id
AND EXISTS (
SELECT
NULL
FROM sessions s2
WHERE s2.user_id = 1234
AND (s.ip = s2.ip
OR s.cookie_identifier = s2.cookie_identifier
)
)
)
;
返回:
import org.apache.spark.sql.functions._
import spark.implicits._
//import org.apache.spark.sql._
//import org.apache.spark.sql.types._
val df = Seq(
("green","y", 4),
("blue","n", 7),
("red","y", 7),
("yellow","y", 7),
("cyan","y", 7)
).toDF("colour", "status", "freq")
val df2 = df.where("status = 'y'")
.select($"freq", $"colour")
.groupBy("freq")
.agg(collect_list($"colour"))
df2.show(false)
但是对于RDD,您可以在DS上使用mapPartitions。