当前位置: 首页 > 知识库问答 >
问题:

在Sparkr中用正则表达式模式应用withColumn函数:重新格式化DataFrame中的string列

濮阳立果
2023-03-14

背景/概述:

我正试图将gsub函数应用于已加载到Spark中的SparkR DataFrame的列,如下所示:

dat <- read.df(sqlContext, "filepath", header='false', inferSchema='true')

dat2<-withColumn(dat,“nperiod”,gsub(“/”,“-”,dat$period))中的错误(dat,“nperiod”,gsub(“/”,“-”,dat$period)):在为函数“with column”选择方法时计算参数“col”时出错:as.character.default(x)中的错误:没有将此S4类强制为向量的方法

也许这只是因为我不知道core Spark是如何在SparkR中使用S4数据类的,但我不知道如何解释这个错误消息,也不知道如何继续解决这个问题的gsub方法。

或者,一种更简陋的方法是将mm/dd/yyyyperiode列拆分为三个单独的列。然而,即使是这样,我也在SparkR环境中苦苦挣扎。我已经创建了一个新的DF,称为separated,它由一个单独的列(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概念,这将有助于解释发生了什么,请随时分享任何相关信息。

编辑:html" target="_blank">添加有关尝试使用强制转换时收到的错误的信息:

当我尝试使用WithColumnperiod强制转换为日期dtype时,我会得到以下错误消息

dat2<-withColumn(dat,“nperiod”,cast(dat$period,“date”))中的错误(dat,“nperiod”,cast(dat$period,“date”)):在为函数“with column”选择方法时计算参数“col”时出错:在为函数“with column”选择方法时计算参数“x”时出错:在cast(dat$period,“date”)中出错:在为函数“cast”选择方法时计算参数“x”时出错:在column(column“选择方法时计算参数”x“时出错:在column(column)如果重新启动了SparkR,则需要重新执行Spark操作。

共有1个答案

刁星渊
2023-03-14

在此上下文中不能使用标准R函数,但在Spark1.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
 类似资料:
  • 问题内容: 有什么方法可以使用正则表达式将字符串格式化为特定模式,还是stringbuilder +子字符串是一种更快的方法? 例如,说出电话号码-> 1234567890作为输入 并输出为->(123)456-7890 我看到有可能在这篇文章上:http : //www.4guysfromrolla.com/webtech/031302-1.shtml,但给出的解释在ASP中。我如何用Java做

  • 我有一个包含魔法方块的大文件,以四个一组由空格分隔: 最终,我想找到并重新格式化这些组,使每个单独的幻方分别显示如下: 首先,我有一个正则表达式,可以查找所有四个数字的组,但如果我指定每个整数前面有0-2个空格,这只给我需要的16个匹配项: (Regexr上保存的版本) 我只想在每一列的开始处捕捉整数前面的零或一个空格,而不是分隔16个块的四个空格。 然后我需要捕获四个整数的16个组中的每一个,并

  • 问题内容: 考虑以下(非常简化的)示例字符串: 如您所见,它是两个值,以逗号分隔。 现在,我 可以 将其与以下内容匹配: 问题是,我必须写两次。对于小模式,这并不是很糟糕,但是对于更复杂的正则表达式,两次编写完全相同的东西会使结束模式变得庞大而繁琐。这似乎也是多余的。 我尝试使用命名捕获组: 但这没用,因为它寻找的是两次,而不是。 有什么方法可以保存模式的一部分,例如,以便以后可以在同一模式中使用

  • 正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块来实现正则匹配。 re模块中常用功能函数: 1、compile(): 编译正则表达式模式,返回一个正则对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。) 格式:re.compile(pattern[,flags=0]) pattern: 编译时用的表达式字符串。 flags

  • 我需要编写一个具有以下规则的正则表达式: null null 这些示例无效: > 12--11(因为它包含两个连字符) 1-2345(因为它包含5号) <>是字符出现在最后一个位置,那么在字符之前必须有一个数字not hypen。 即11-A(必须不及格)11-1A(必须及格)

  • 我是正则表达式的初学者,并尝试搜索特定的数字模式。以下数据以 XML 格式嵌入。 要求是提取数据(最里面的列表)。在这个例子中,数据从24779开始到24760。注意:每次数据可能不是从“24”开始。因此,我计划通过以下逻辑提取:如果标签名(在本例中:DUT_1_PC)具有非零的有效数据,并且有效数据的计数大于100,用逗号分隔,则提取该列表及其标签名(DUT_1_PC)。 我无法提取所需的数据。