【问题标题】:Parallelizing independent actions on the same DataFrame in Spark在 Spark 中并行化同一 DataFrame 上的独立操作
【发布时间】:2018-01-24 06:58:45
【问题描述】:

假设我有一个具有以下架构的 Spark DataFrame

root
 | -- prob: Double
 | -- word: String

我想从这个DataFrame 中随机选择两个不同的词,但我想执行这个动作 X 次,所以最后我会随机选择 X 个词元组,并且当然,每个选择 id 彼此独立。我该如何做到这一点?

示例:

假设这是我的数据集:

[(0.1,"blue"),(0.2,"yellow"),(0.1,"red"),(0.6,"green")]

第一个编号为prob,第二个编号为word。对于 X=5,输出将是:

1. blue, green
2. green, yellow
3. green, yellow
4. yellow, blue
5. green, red

因为它们是独立的动作,你可以看到 2 和 3 是一样的,这很好。但是在每个元组中,一个词只能重复一次。

【问题讨论】:

  • 希望this有帮助
  • 不要太多:/这是一次从数据集中取出 n 行,而我需要并行执行几次
  • @shakedzy 你的情况有什么不同?
  • 我不清楚。你能更具体一点吗?举个例子吧。
  • @addmeaning 这是不同的,因为在我的情况下,可以为多个元组选择同一个单词,因为不同的选择是独立的。在这个例子中,如果我选择 2*X 行,每行只能选择一次

标签: apache-spark


【解决方案1】:

1) 您可以使用以下 DataFrame 方法之一:

  • randomSplit(weights: Array[Double], seed: Long)
  • randomSplitAsList(weights: Array[Double], seed: Long)
  • sample(withReplacement: Boolean, fraction: Double)

然后取前两行。

2) 随机排列并取前两个。

import org.apache.spark.sql.functions.rand
dataset.orderBy(rand()).limit(n)

3) 或者你可以使用RDD的takeSample方法,然后将其转换为DataFrame:

def takeSample(
      withReplacement: Boolean,
      num: Int,
      seed: Long = Utils.random.nextLong): Array[T]

例如:

dataframe.rdd.takeSample(true, 1000).toDF()

【讨论】:

  • 你说的是获取一个单词元组的过程——我需要重复这个过程几次。如果我在一个循环中重复这个过程,Spark会并行化它,还是一个一个地做?
  • 循环的每次迭代都会并行完成,但我认为 Spark 不会并行化所有循环过程。
  • 有没有办法让它也并行化循环?我的意思是,它们是独立的,所以把它作为一个序列来做是一种浪费......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2016-07-14
相关资源
最近更新 更多