Regex 数据帧中包含子字符串的行数
我尝试此解决方案来测试子字符串中的字符串是否:Regex 数据帧中包含子字符串的行数,regex,scala,apache-spark,Regex,Scala,Apache Spark,我尝试此解决方案来测试子字符串中的字符串是否: val reg = ".*\\[CS_RES\\].*".r reg.findAllIn(my_DataFrame).length 但它不起作用,因为我无法将findAllIn应用于数据帧 我尝试了第二种解决方案,我将我的DataFrame转换为RDD: val rows: RDD[Row] = myDataFrame.rdd val processedRDD = rows.map{ str => val p
val reg = ".*\\[CS_RES\\].*".r
reg.findAllIn(my_DataFrame).length
但它不起作用,因为我无法将findAllIn
应用于数据帧
我尝试了第二种解决方案,我将我的DataFrame
转换为RDD
:
val rows: RDD[Row] = myDataFrame.rdd
val processedRDD = rows.map{
str =>
val patternReg = ".*\\[CS_RES\\].*".r
val result = patternReg.findAllIn(str).length
(str, result)
}
它显示一个错误:
<console>:69: error: type mismatch;
found : org.apache.spark.sql.Row
required: CharSequence
val result = patternReg.findAllIn(str).length
:69:错误:类型不匹配;
找到:org.apache.spark.sql.Row
必需:CharSequence
val result=patternReg.findAllIn(str).length
在第一个解决方案中,如何在DataFrame scala上应用正则表达式来计算包含字符串[CS\u RES]
的行数
或者如果有人有第二种解决方案?您可以使用函数筛选和计数行。例如:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
private val session: SparkSession = ...
import session.implicits._
val myDataFrame = Seq(
(1L, "abc"),
(2L, "def"),
(3L, "a[CS_RES]b"),
(4L, "adg")
).toDF("id", "text")
val resultRegex = myDataFrame.where(regexp_extract($"text", "\\[CS_RES\\]", 0).notEqual("")).count()
println(resultRegex) // outputs 1
其思想是:如果regexp\u extract
返回的第一个组(i=0)不是空字符串,则找到子字符串。调用count()
返回这些字符串的总数
但是,如果只需要找到子字符串的精确匹配,可以使用locate
函数简化解决方案:
val resultLocate = myDataFrame.where(locate("[CS_RES]", $"text") > 0).count()
println(resultLocate) // outputs 1
您可以使用函数对行进行过滤和计数。例如:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
private val session: SparkSession = ...
import session.implicits._
val myDataFrame = Seq(
(1L, "abc"),
(2L, "def"),
(3L, "a[CS_RES]b"),
(4L, "adg")
).toDF("id", "text")
val resultRegex = myDataFrame.where(regexp_extract($"text", "\\[CS_RES\\]", 0).notEqual("")).count()
println(resultRegex) // outputs 1
其思想是:如果regexp\u extract
返回的第一个组(i=0)不是空字符串,则找到子字符串。调用count()
返回这些字符串的总数
但是,如果只需要找到子字符串的精确匹配,可以使用locate
函数简化解决方案:
val resultLocate = myDataFrame.where(locate("[CS_RES]", $"text") > 0).count()
println(resultLocate) // outputs 1
您的数据框架的模式是什么?我编辑了我的问题您的数据框架的模式是什么?我编辑了我的问题我将其更改为:val myDataFrame=Seq(Origin\u Datatframe)。toDF(“summary”)val resultRegex=myDataFrame.where(regexp\u extract($“summary”),“\[CS\u RES\]”,0)。notEqual(“”)。count()错误:value where不是Seq的成员[org.apache.spark.sql.Column]它适用于您的示例,但myDataframe包含100万行。没有必要将原始数据框包装到
Seq
。您是否尝试过Origin\u Datatframe.where(…)
或input\u jiraissue.where(…)
?我将其更改为:val myDataframe=Seq(Origin\u Datatframe).toDF(“摘要”)val resultRegex=myDataFrame.where(regexp\u extract($“summary”,“\[CS\u RES\]”,0)。notEqual(“”)。count()错误:其中的值不是Seq[org.apache.spark.sql.Column]的成员它适用于您的示例,但myDataframe包含100万行。无需将原始数据框包装到序列中。您是否尝试过原始数据框。其中(…)
或输入\u jiraissue。其中(…)
?18/06/28 12:59:20警告TaskSetManager:在21.0阶段丢失任务6.0(TID 146,本地主机,执行器驱动程序):org.apache.spark.SparkException:无法执行用户定义的函数($anonfun$1:(string)=>boolean),原因是:java.lang.NullPointerExceptionI已更改:(s:string)这是我在StackOverflow上键入而不是repl时得到的结果:)18/06/28 12:59:20警告TaskSetManager:在21.0阶段丢失任务6.0(TID 146,本地主机,执行器驱动程序):org.apache.spark.SparkException:无法执行用户定义的函数($anonfun$1:(字符串)=>boolean),原因是:java.lang.NullPointerExceptionI已更改:(s:string)这是我在StackOverflow上键入而不是repl时得到的结果:)