使用Spark和Scala的并行API请求

时间:2019-01-06 22:40:27

标签: scala apache-spark apache-spark-sql

我正在使用Spark 2.4.0和Scala 2.11。 当用户包含:(country,id,url)时,我有Dataset [Users]。 我想将此DS按国家/地区分组,对于每个分组, 请求URL,以获取有关该国家/地区用户的详细信息。

什么是最好的方法? 使用mapPartitions? foreachPartition? 谢谢

1 个答案:

答案 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。