Количество строк, содержащих подстроку в DataFrame - PullRequest
0 голосов
/ 28 июня 2018

Я попытался это решение, чтобы проверить, если строка в подстроке:

val reg = ".*\\[CS_RES\\].*".r
reg.findAllIn(my_DataFrame).length

Но это не работает, потому что я не могу применить findAllIn к Dataframe.

Я попробовал это второе решение, я конвертировал 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

Как я могу применить Regex к scala DataFrame в первом решении, чтобы вычислить number of the lines, который содержит строку [CS_RES] или если у кого-то есть решение для второго решения?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018
import org.apache.spark.sql.functions.udf
val reg = ".*\\[CS_RES\\].*".r
val contains=udf((s:String)=>reg.findAllIn(s).length >0)

val cnt = df.select($"summary").filter(contains($"summary")).count()
0 голосов
/ 28 июня 2018

Вы можете использовать функцию regexp_extract для фильтрации и подсчета строк. Например:

  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

Идея такова: если первая группа (i = 0), возвращаемая regexp_extract, не является пустой строкой, подстрока найдена. Вызов count() возвращает общее количество этих строк.

Но если вам нужно найти только точные совпадения подстрок, решение можно упростить с помощью функции locate:

  val resultLocate = myDataFrame.where(locate("[CS_RES]", $"text") > 0).count()

  println(resultLocate) // outputs 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...