如何在SparkR中找到列的长度

时间:2016-04-06 13:15:34

标签: r apache-spark sparkr

我正在将一个普通的R代码转换为SparkR,以便有效地使用Spark。

我有以下列CloseDate。

CloseDate
2011-01-08
2011-02-07
2012-04-07
2013-04-18
2011-02-07
2010-11-10
2010-12-09
2013-02-18
2010-12-09
2011-03-11
2011-04-10
2013-06-19
2011-04-10
2011-01-06
2011-02-06
2013-04-16
2011-02-06
2015-09-25
2015-09-25
2010-11-10

我想计算日期增加的时间。我有以下R代码来做到这一点。

dateChange <- function(closeDate, dir){
  close_dt <- as.Date(closeDate)
  num_closedt_out = 0
  num_closedt_in = 0

  for(j in 1:length(close_dt)) 
  {
    curr <- close_dt[j]
    if (j > 1)
      prev <- close_dt[j-1]
    else 
      prev <- curr
    if (curr > prev){
      num_closedt_out = num_closedt_out + 1
    }
    else if (curr < prev){
      num_closedt_in = num_closedt_in + 1
    }
  }
  if (dir=="inc")
    ret <- num_closedt_out
  else if (dir=="dec")
    ret <- num_closedt_in
  ret
} 

我试图在这里使用SparkR df $ col。由于spark懒惰地执行代码,因此在执行期间我没有得到length的值并且得到NaN错误。

以下是我尝试过的修改后的代码。

DateDirChanges <- function(closeDate, dir){
  close_dt <- to_date(closeDate)
  num_closedt_out = 0
  num_closedt_in = 0

  col_len <- SparkR::count(close_dt)
  for(j in 1:col_len) 
  {
    curr <- close_dt[j]
    if (j > 1)
      prev <- close_dt[j-1]
    else 
      prev <- curr
    if (curr > prev){
      num_closedt_out = num_closedt_out + 1
    }
    else if (curr < prev){
      num_closedt_in = num_closedt_in + 1
    }
  }
  if (dir=="inc")
    ret <- num_closedt_out
  else if (dir=="dec")
    ret <- num_closedt_in
  ret
}

如何在执行此代码期间获取列的长度?或者还有其他更好的做法吗?

1 个答案:

答案 0 :(得分:2)

你不能因为Column没有长度。与R列中的预期不同,不表示数据,而是表示SQL表达式和特定数据转换。此外,Spark DataFrame中的值顺序是任意的,因此您不能只是环顾四周。

如果可以像上一个问题一样对数据进行分区,则可以使用与我显示的in the answer to your previous question相同的窗口函数。否则,单独使用SparkR无法有效地处理此问题。

假设有一种方法可以确定订单(必需)并且您可以对数据进行分区(希望获得合理的性能),您只需要这样:

SELECT
   CAST(LAG(CloseDate, 1) OVER w > CloseDate AS INT) gt,
   CAST(LAG(CloseDate, 1) OVER w < CloseDate AS INT) lt,
   CAST(LAG(CloseDate, 1) OVER w = CloseDate AS INT) eq
FROM DF
WINDOW w AS (
  PARTITION BY partition_col ORDER BY order_col
)