【问题标题】:How to randomly selecting rows from one dataframeusing information from another dataframe如何使用来自另一个数据帧的信息从一个数据帧中随机选择行
【发布时间】:2018-08-20 20:23:21
【问题描述】:

我正在 Scala-Spark 中尝试以下内容。

我希望有人能给我一些关于如何解决这个问题的指导,或者为我提供一些资源来弄清楚我能做什么。

我有一个dateCountDF,其计数对应于日期。我想从另一个数据帧entitiesDF 中为每个dateCountDF.month 随机选择一定数量的条目,其中dateCountDF.FirstDate<entitiesDF.Date && entitiesDF.Date <= dateCountDF.LastDate 然后将所有结果放入一个新的数据帧中。 请参阅下面的数据示例

我完全不确定如何从 Spark-SQl 或 Spark-MapReduce 的角度解决这个问题。我得到的最远的方法是天真的方法,我在数据帧上使用foreach,然后在函数中引用另一个数据帧。但这不起作用,因为 Spark 的分布式特性。

val randomEntites = dateCountDF.foreach(x => {
  val count:Int = x(1).toString().toInt 
  val result = entitiesDF.take(count)
  return result
})

数据帧

**dateCountDF**
|   Date   |      Count     |
+----------+----------------+
|2016-08-31|               4|
|2015-12-31|               1|
|2016-09-30|               5|
|2016-04-30|               5|
|2015-11-30|               3|
|2016-05-31|               7|
|2016-11-30|               2|
|2016-07-31|               5|
|2016-12-31|               9|
|2014-06-30|               4|
+----------+----------------+
only showing top 10 rows

**entitiesDF**
|    ID    |     FirstDate   | LastDate |
+----------+-----------------+----------+
|       296|       2014-09-01|2015-07-31|
|       125|       2015-10-01|2016-12-31|
|       124|       2014-08-01|2015-03-31|
|       447|       2017-02-01|2017-01-01|
|       307|       2015-01-01|2015-04-30|
|       574|       2016-01-01|2017-01-31|
|       613|       2016-04-01|2017-02-01|
|       169|       2009-08-23|2016-11-30|
|       205|       2017-02-01|2017-02-01|
|       433|       2015-03-01|2015-10-31|
+----------+-----------------+----------+
only showing top 10 rows

编辑: 为了澄清。 我的输入是entitiesDF 和dateCountDF。我想遍历dateCountDF 并且对于每一行我想在entitiesDF 中选择随机数量的实体@ 987654332@

【问题讨论】:

  • 输入是什么,你想要什么输出可以再举例说明
  • @RahulNirdhar 谢谢拉胡尔。请参阅我添加的编辑。让我知道这是否可以澄清事情?
  • 你得到了这个答案

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


【解决方案1】:

要在 scala 中随机选择,您可以这样做

import random 
def sampler(df, col, records):

  # Calculate number of rows
  colmax = df.count()

  # Create random sample from range
  vals = random.sample(range(1, colmax), records)

  # Use 'vals' to filter DataFrame using 'isin'
  return df.filter(df[col].isin(vals))

选择要存储在数据框中的随机行数,然后将此数据添加到另一个数据框中,您可以使用 unionAll。

你也可以参考this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 2020-07-23
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多