小编kjm*_*mij的帖子

导出函数中的R data.table中断

我在将data.table用于roxygen2导出函数时遇到问题.

这是一个名为foo.R的文件中的一个简单的假函数(位于我的包的R目录中),它使用data.table:

#' Data.table test function
#' @export
foo <- function() {
  m <- data.table(c1 = c(1,2,3))
  print(is.data.table(m))
  m[,sum(c1)]
}
Run Code Online (Sandbox Code Playgroud)

如果我将此函数复制并粘贴到R中,此函数可以正常工作:

> foo <- function() {
+   m <- data.table(c1 = c(1,2,3))
+   print(is.data.table(m))
+   m[,sum(c1)]
+ }
> foo()
[1] TRUE
[1] 6
Run Code Online (Sandbox Code Playgroud)

但是,如果我只是加载导出的函数,R认为data.table是一个data.frame并且中断:

> rm(foo)
> load_all()
Loading test_package
> foo
function() {
  m <- data.table(c1 = c(1,2,3))
  print(is.data.table(m))
  m[,sum(c1)]
}
<environment: namespace:test_package>
> foo()
[1] TRUE
Error in `[.data.frame`(x, i, j) : object 'c1' not found
Run Code Online (Sandbox Code Playgroud)

这是怎么回事? …

r devtools data.table

20
推荐指数
1
解决办法
1868
查看次数

如何从Pyspark中的一列日期中减去一列天数?

给出以下PySpark DataFrame

df = sqlContext.createDataFrame([('2015-01-15', 10),
                                 ('2015-02-15', 5)],
                                 ('date_col', 'days_col'))
Run Code Online (Sandbox Code Playgroud)

如何从日期列中减去日期列?在此示例中,结果列应为['2015-01-05', '2015-02-10'].

我调查了pyspark.sql.functions.date_sub(),但它需要一个日期列和一天,即date_sub(df['date_col'], 10).理想情况下,我更愿意这样做date_sub(df['date_col'], df['days_col']).

我也试过创建一个UDF:

from datetime import timedelta
def subtract_date(start_date, days_to_subtract):
    return start_date - timedelta(days_to_subtract)

subtract_date_udf = udf(subtract_date, DateType())
df.withColumn('subtracted_dates', subtract_date_udf(df['date_col'], df['days_col'])
Run Code Online (Sandbox Code Playgroud)

这在技术上有效,但我已经读过Spark和Python之间的步骤可能会导致大型数据集的性能问题.我现在可以坚持使用这个解决方案(不需要过早优化),但我的直觉说只需要一种方法来做这个简单的事情而不使用Python UDF.

python user-defined-functions apache-spark apache-spark-sql pyspark

11
推荐指数
2
解决办法
8526
查看次数