【问题标题】:Generating all possible combinations from a Data Frame in Apache Spark从 Apache Spark 中的数据帧生成所有可能的组合
【发布时间】:2018-10-10 18:36:46
【问题描述】:

我正在尝试做一些非常简单的事情,其中​​我有 2 个已转换为数据框的数组,并且我想显示所有可能的组合。例如,我现在的输出如下所示:

+-----------+-----------+
|         A |         B |
+-----------+-----------+
|     First |         T |
|    Second |         P |
+-----------|-----------+

但我真正想要的是:

+-----------+-----------+
|         A |         B |
+-----------+-----------+
|     First |         T |
|     First |         P |
|    Second |         T |
|    Second |         P |
+-----------|-----------+

到目前为止,我已经有了一些相当简单的代码来将我的数组映射到列中,但是对于同时使用 Scala 和 Spark 来说还是很陌生的,我不确定如何掌握所有这些组合。这是我目前所拥有的:

val firstColumnValues = Array("First", "Second")
val secondColumnValues = Array("T", "P")

val xs = Array(firstColumnValues, secondColumnValues).transpose
val mapped = sparkContext.parallelize(xs).map(ys => Row(ys(0), ys(1)))
val df = mapped.toDF("A", "B")

df.show

...

case class Row(first: String, second: String)

提前感谢您的帮助

【问题讨论】:

    标签: scala apache-spark dataframe


    【解决方案1】:

    在 Spark 2.3 中

    val firstColumnValues = sc.parallelize(Array("First", "Second")).toDF("A")
    val secondColumnValues = sc.parallelize(Array("T", "P")).toDF("B")
    val fullouter = firstColumnValues.crossJoin(secondColumnValues).show
    

    【讨论】:

    • 谢谢,效果很好!这也适用于 2 个以上的集合吗?假设我有 5 个不同的集合,我想将它们组合成一个数据框,我还能在这里使用相同的方法吗?
    • 嗨,是的,您可以声明另一个集合并继续将其添加到连接中,如下所示。但是对于大型数据集要非常小心。 val thr= sc.parallelize(Array("1", "2")).toDF("C") val fullouter = firstColumnValues.crossJoin(secondColumnValues).crossJoin(thr).show
    • 好的,谢谢。您说要小心处理大型数据集 - 有没有一点效率会变得非常低?
    • 嗯... Inneficient 并不是真正的问题,un-manageable 可能更适合。一千行的 4 列构成 trillion 行交叉连接。一个 64-CPU 集群可能会在几个小时内完成一万亿次不平凡的事情时遇到很多麻烦。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2016-01-07
    • 2018-04-22
    • 2016-08-16
    相关资源
    最近更新 更多