如何使用来自另一个数据帧的信息从一个数据帧中随机选择行

时间:2017-04-13 09:01:32

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

以下我在Scala-Spark中尝试。

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

我有@interface Request<__covariant T>: NSObject - (T) parseResponseData: (NSData *) data; - (T) loadWithWebservice: (Webservice *) ws; @end ,其计数与日期相对应。我想从另一个dateCountDF dateCountDF.month entitiesDF中为每个dateCountDF.FirstDate<entitiesDF.Date && entitiesDF.Date <= dateCountDF.LastDate随机选择一定数量的条目,然后将所有结果放入新的数据框中。 参见Bellow for Data Example

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

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

DataFrames

**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

修改 为了澄清。 我的输入是entitiesDFdateCountDF。我想循环遍历dateCountDF,对于每一行,我想在entitiesDF中选择随机数量的实体dateCountDF.FirstDate<entitiesDF.Date && entitiesDF.Date <= dateCountDF.LastDate

1 个答案:

答案 0 :(得分:0)

要选择随机,您可以在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