【问题标题】:Spark Dataframe - Get all lists of pairs (Scala)Spark Dataframe - 获取所有对列表(Scala)
【发布时间】:2020-05-12 21:59:57
【问题描述】:

我有以下情况: 我有一个以“数组”作为架构的数据框。现在我想为每个数组获取所有对列表并将其再次保存在数据框中。比如:

这是原始数据框:

+---------------+
|  candidateList|
+---------------+
|         [1, 2]|
|      [2, 3, 4]|
|      [1, 3, 5]|
|[1, 2, 3, 4, 5]|
|[1, 2, 3, 4, 5]|
+---------------+

这就是计算后的样子:

+---------------+
|  candidates   |
+---------------+
|         [1, 2]|
|         [2, 3]|
|         [2, 4]|
|         [3, 4]|
|         [1, 3]|
|         [1, 5]|
|         [3, 5]|
|and so on...   |
+---------------+

我真的不知道这在 spark 中是如何实现的,也许有人给我提示。

亲切的问候

【问题讨论】:

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


    【解决方案1】:

    您需要创建一个 UDF(用户定义函数)并将其与 explode 函数一起使用。由于 Scala 集合的 combinations 方法,UDF 本身很简单:

    import scala.collection.mutable
    import org.apache.spark.sql.functions._
    import spark.implicits._
    
    val pairsUdf = udf((arr: mutable.Seq[Int]) => arr.combinations(2).toArray)
    val result = df.select(explode(pairsUdf($"candidateList")) as "candidates")
    
    result.show(numRows = 8)
    // +----------+
    // |candidates|
    // +----------+
    // |    [1, 2]|
    // |    [2, 3]|
    // |    [2, 4]|
    // |    [3, 4]|
    // |    [1, 3]|
    // |    [1, 5]|
    // |    [3, 5]|
    // |    [1, 2]|
    // +----------+
    

    【讨论】:

    • 太完美了!非常感谢!!
    • 你为什么用mutable.Seq
    • Spark 的数组类型列的内部表示使用mutable.WrappedArray,它扩展了mutable.Seq 而不是immutable.Seq - 所以在这里使用Seq 会导致ClassCastException。当然,您也可以使用mutable.WrappedArray[Int],但这会比它应该的更具体。
    • 我总是只使用Seq,没有例外
    • @RaphaelRoth 这很有趣,我肯定遇到了一个例外。您确定您的范围内没有import scala.collection.mutable.Seq 吗?您使用的是哪个 Spark 版本?我正在使用 2.3.0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多