首页 文章

在SparkR中应用带有正则表达式模式的withColumn函数:重新格式化DataFrame中的字符串列

提问于
浏览
1

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中的函数 castas.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概念,请随时分享有关该信息的任何信息 .

编辑:添加有关我尝试使用强制转换时收到的错误的信息:

当我尝试使用 withColumnperiod 转换为日期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 回答

  • 3

    您不能在此上下文中使用标准R函数,但在Spark 1.6中,您可以使用内置日期处理函数:

    df <- createDataFrame(sqlContext, data.frame(ds=c('04/02/2015', '03/10/2014')))
    
    dt <- cast(cast(unix_timestamp(df$ds, 'MM/dd/yyyy'), 'timestamp'), 'date')
    
    df %>% withColumn('date', dt) %>% head()
    ##           ds       date
    ## 1 04/02/2015 2015-04-02
    ## 2 03/10/2014 2014-03-10
    

相关问题