在 SparkR 中应用带有正则表达式模式的 withColumn 函数:重新格式化 DataFrame 中的字符串列
Posted
技术标签:
【中文标题】在 SparkR 中应用带有正则表达式模式的 withColumn 函数:重新格式化 DataFrame 中的字符串列【英文标题】:Applying withColumn function with regular expression patterns in SparkR: reformat a string column in a DataFrame 【发布时间】:2016-06-23 15:44:52 【问题描述】:背景/概述:
我正在尝试将 gsub
函数应用于我已从以下加载到 Spark 中的 SparkR DataFrame 的列:
dat <- read.df(sqlContext, "filepath", header='false', inferSchema='true')
我使用的是 Spark 1.6.1,数据文件在作为 SparkR DataFrame 读入之前存储为 parquet 文件。
问题的核心:
我的 DataFrame (DF) 中有一个名为 period
的列,它由当前为字符串形式 MM/DD/YYYY 的日期组成,例如2001 年 9 月 23 日。我想将其转换为 SparkR 中的日期类型对象。然而,我可以说的是,SparkR 中的函数cast
和as.Date
只能将字符串日期转换为日期类型对象,前提是它的格式为 MM-DD-YYYY。
在尝试将我的 period
列转换为可以重铸为日期 dtype 的表单时,我正在尝试使用 gsub
R 函数和 withColumn
SparkR 函数来创建一个新的 DF,@ 987654330@ 附加列 nperiod
,其中 period
的所有行条目从 MM/DD/YYYY 格式转换为 MM-DD-YYYY。下面的代码给出了我的第一次尝试,但我收到了以下错误消息:
dat2 <- withColumn(dat, "nperiod", gsub("/", "-", dat$period))
dat2
也许这只是我对核心 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 概念,请随时分享与此相关的任何信息。
编辑:添加有关我尝试使用 cast 时收到的错误的信息:
当我尝试使用 withColumn
将 period
转换为日期 dtype 时,我收到以下错误消息:
dat2
【问题讨论】:
只需使用 Spark 日期处理函数即可。以这种方式执行纯 R 代码是不可能的。 你的意思是我应该使用as.Date
还是cast
?因为我尝试了这两种方法并收到错误。
@zero323 我在我的问题中添加了其他信息,关于我尝试使用cast
函数将period
转换为日期数据类型。
***.com/q/36948012/1560062
感谢@zero323 的链接。您是说我需要指定一个新的日期格式,然后将其作为我的 dtype 规范包含在 cast
中吗?
【参考方案1】:
您不能在此上下文中使用标准 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
【讨论】:
以上是关于在 SparkR 中应用带有正则表达式模式的 withColumn 函数:重新格式化 DataFrame 中的字符串列的主要内容,如果未能解决你的问题,请参考以下文章