Background/overview:
我试图将 gsub
函数应用于我已加载到Spark中的SparkR DataFrame的列,如下所示:
dat <- read.df(sqlContext, "filepath", header='false', inferSchema='true')
我使用的是Spark 1.6.1,数据文件存储为镶木地板文件,然后将其作为SparkR DataFrame读取 .
The core of the problem:
我的DataFrame(DF)中有一个名为 period
的列,它由当前为字符串形式MM / DD / YYYY的日期组成,例如2001年9月23日 . 我想将它转换为SparkR中的日期类型对象 . 然而,我可以告诉我,SparkR中的函数 cast
和 as.Date
只能将字符串日期转换为日期类型对象(如果它的格式为MM-DD-YYYY) .
在尝试将我的 period
列转换为可以重新设置为日期dtype的表单时,我正在尝试将 gsub
R函数与 withColumn
SparkR函数一起使用来创建一个新的DF, dat2
带有附加列, nperiod
,所有 period
的行条目从MM / DD / YYYY格式转换为MM-DD-YYYY . 我的第一次尝试是由下面的代码给出的,但是我收到了以下错误消息: dat2 <- withColumn(dat, "nperiod", gsub("/", "-", dat$period))
dat2 < - withColumn(dat,“nperiod”,gsub(“/”,“ - ”,dat $ period))withColumn(dat,“nperiod”,gsub(“/”,“ - ”,dat $ period)出错)):在为函数'withColumn'选择方法时评估参数'col'时出错:as.character.default(x)中的错误:没有将此S4类强制转换为向量的方法
也许这只是我对Core Spark如何在SparkR中使用S4数据类的无知,但我不确定如何解释此错误消息或如何继续解决此问题的 gsub
方法 .
或者,更糟糕的方法是将MM / DD / YYYY period
列拆分为三个单独的列 . 然而,即便如此,我也在SparkR环境中苦苦挣扎 . 我已经创建了一个名为 separated
的新DF,它由一个列( period_sep
)组成, period
组件的行由逗号分隔,但我不完全确定它在哪个数据结构中,或者下一步将其分为三个单独的列 .
> separated <- selectExpr(dat, "split(period, '/') AS period_sep")
> head(separated)
period_sep
1 01, 01, 2000
2 02, 01, 2000
3 03, 01, 2000
4 04, 01, 2000
5 05, 01, 2000
6 06, 01, 2000
如果有人想过如何继续这两个方向,或者有更好的方法来做到这一点,我们将非常感激 . 此外,如果我似乎不理解一些有助于解释正在发生的事情的基本Spark概念,请随时分享有关该信息的任何信息 .
编辑:添加有关我尝试使用强制转换时收到的错误的信息:
当我尝试使用 withColumn
将 period
转换为日期dtype时,收到以下错误消息:
dat2 < - withColumn(dat,“nperiod”,cast(dat $ period,“date”))withColumn(dat,“nperiod”,cast(dat $ period,“date”))中的错误:评估参数时出错'col'选择函数'withColumn'的方法:强制转换中的错误(dat $ period,“date”):在选择函数'cast'的方法时评估参数'x'时出错:列中的错误(callJMethod( x @ sdf,“col”,c)):在为函数'column'选择方法时评估参数'x'时出错:callJMethod中的错误(x @ sdf,“col”,c):无效的jobj 2.如果SparkR重启,Spark操作需要重新执行 .
1 回答
您不能在此上下文中使用标准R函数,但在Spark 1.6中,您可以使用内置日期处理函数: