在 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 中的函数castas.Date 只能将字符串日期转换为日期类型对象,前提是它的格式为 MM-DD-YYYY。

在尝试将我的 period 列转换为可以重铸为日期 dtype 的表单时,我正在尝试使用 gsub R 函数和 withColumn SparkR 函数来创建一个新的 DF,@ 987654330@ 附加列 nperiod,其中 period 的所有行条目从 MM/DD/YYYY 格式转换为 MM-DD-YYYY。下面的代码给出了我的第一次尝试,但我收到了以下错误消息: dat2 &lt;- 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 时收到的错误的信息:

当我尝试使用 withColumnperiod 转换为日期 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 中的字符串列的主要内容,如果未能解决你的问题,请参考以下文章

带有子模式异常的正则表达式模式 (Python)

如何检测带有下划线的字符串的正则表达式模式

PHP - 带有 unicode 正则表达式的 XSD 模式验证错误

Python100天学习笔记Day12 正则表达式

Python100天学习笔记Day12 正则表达式

如何将 Python 和 Notepad++ 中的连字符单词与带有异常模式的正则表达式结合起来?