如何从字符串列中提取数字?

Posted

技术标签:

【中文标题】如何从字符串列中提取数字?【英文标题】:How to extract number from string column? 【发布时间】:2017-12-13 08:27:27 【问题描述】:

我的要求是从comment 列中的评论列中检索订单号,并且始终以R 开头。订单号应作为新列添加到表格中。

输入数据:

code,id,mode,location,status,comment 
AS-SD,101,Airways,hyderabad,D,order got delayed R1657
FY-YT,102,Airways,Delhi,ND,R7856 package damaged
TY-OP,103,Airways,Pune,D,Order number R5463 not received

预期输出:

AS-SD,101,Airways,hyderabad,D,order got delayed R1657,R1657
FY-YT,102,Airways,Delhi,ND,R7856 package damaged,R7856 
TY-OP,103,Airways,Pune,D,Order number R5463 not received,R5463 

我在spark-sql中试过了,我使用的查询如下:

val r = sqlContext.sql("select substring(comment, PatIndex('%[0-9]%',comment, length(comment))) as number from A")

但是,我收到以下错误:

org.apache.spark.sql.AnalysisException: undefined function PatIndex; line 0 pos 0

【问题讨论】:

【参考方案1】:

你可以使用regexp_extract,它有如下定义:

def regexp_extract(e: Column, exp: String, groupIdx: Int): Column

(R\\d4) 表示 R 后跟 4 位数字。您可以使用有效的正则表达式轻松适应任何其他情况

df.withColumn("orderId", regexp_extract($"comment", "(R\\d4)" , 1 )).show

+-----+---+-------+---------+------+--------------------+-------+
| code| id|   mode| location|status|             comment|orderId|
+-----+---+-------+---------+------+--------------------+-------+
|AS-SD|101|Airways|hyderabad|     D|order got delayed...|  R1657|
|FY-YT|102|Airways|    Delhi|    ND|R7856 package dam...|  R7856|
|TY-OP|103|Airways|     Pune|     D|Order number R546...|  R5463|
+-----+---+-------+---------+------+--------------------+-------+

【讨论】:

【参考方案2】:

你可以使用udf函数如下

import org.apache.spark.sql.functions._
def extractString = udf((comment: String) => comment.split(" ").filter(_.startsWith("R")).head)

df.withColumn("newColumn", extractString($"comment")).show(false)

其中comment 列是splitted 与空格filtering 以R 开头的单词。 head 将采用以R 开头的第一个过滤词。

更新

为确保返回的字符串是order number以R开头,其余字符串为digits,可以额外添加filter

import scala.util.Try
def extractString = udf((comment: String) => comment.split(" ").filter(x => x.startsWith("R") && Try(x.substring(1).toDouble).isSuccess).head)

您可以根据需要编辑filter

【讨论】:

以上是关于如何从字符串列中提取数字?的主要内容,如果未能解决你的问题,请参考以下文章

从不在任何其他数字之前或之后的pandas字符串列中提取最多N位数

从pandas DataFrame中另一列中的位置给定的字符串列中提取字符[重复]

从数据框字符串列中提取特定单词并存储在 Python 的新列中

Python:从数据框字符串列中提取维度数据并为每个列创建具有值的列

如何查找和替换字符串列中数字之间的空格?

如何在条件与数字之间使用 Oracle 中的字符串列