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

标签 scala apache-spark apache-spark-sql

我的要求是从评论列中检索订单号,该评论列位于 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

最佳答案

您可以使用具有定义的regexp_extract:

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

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

df.withColumn("orderId", regexp_extract($"comment", "(R\\d{4})" , 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|
+-----+---+-------+---------+------+--------------------+-------+

关于scala - 如何从字符串列中提取数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47788528/

相关文章:

scala - Mockito:对重载定义的引用不明确

scala - scala中空特征的目的是什么

java - 过滤和减少之间的区别?

java - 无法在代码中向spark-cluster提交应用程序

python - 意外类型 : <class 'pyspark.sql.types.DataTypeSingleton' > when casting to Int on a ApacheSpark Dataframe

python - 有没有办法计算 Spark df 中每行的非空值?

scala - 如何编写返回验证的函数?

scala - 使用术语 "Abstract Syntax Tree"

scala - 如何拆分输入文件名并在 spark 数据框列中添加特定值

dataframe - 如何使用来自另一个数据帧的随机值更新 PySpark 中的数据帧?