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时得到的结果:)