Scala / Spark - подсчет количества строк в кадре данных, в котором поле соответствует регулярному выражению - PullRequest
1 голос
/ 21 марта 2020

Я создал фрейм данных с двумя столбцами, названными «project_code» и «page_title». Я хочу посчитать количество строк, в которых «page_title» начинается с «The» и имеет что-нибудь после этого. Для этого я использую регулярное выражение, которое выглядит как «^ The *».

Вот что у меня есть до сих пор:

val df = spark.read.textFile(“/pagecounts-20160101-000000”).map(l => {
    val a = l.split(“ “)
    (a(0), a(1))
}).toDF(“project_code”, “page_title”)

import scala.util.matching.Regex

val the = "^The*".r

Отсюда я не уверен, что делать. Я думаю, что я должен выполнить groupBy, используя регулярное выражение в качестве критерия, а затем агрегировать. Однако я действительно не уверен, как группироватьBy или объединять, используя в качестве критерия регулярное выражение.

Если вы ищете образец того, как выглядят данные, вы можете найти его здесь

Ответы [ 2 ]

1 голос
/ 21 марта 2020

После преобразования в .toDF вы можете использовать функции .startsWith (или) .rlike для filter соответствующих строк в кадре данных.

Example:

spark.sparkContext.textFile("/pagecounts-20160101-000000").map(_.split(" ")).
map(c => (c(0),c(1))).
toDF("project_code","page_title").
withColumn("match", col("page_title").startsWith("The")).
filter(col("match")).
show()

//+------------+--------------------+-----+
//|project_code|          page_title|match|
//+------------+--------------------+-----+
//|          ab|The_DeFranco_Fami...| true|
//|          ab|The_Great_War(195...| true|
//|          af|The_Gods_Must_Be_...| true|
//|          af|        The_Guardian| true|
//|          af|         The_Killers| true|
//+------------+--------------------+-----+

//to count number of matching rows using .startsWith  function
spark.sparkContext.textFile("/pagecounts-20160101-000000").map(_.split(" ")).
map(c => (c(0),c(1))).
toDF("project_code","page_title").
withColumn("match", col("page_title").startsWith("The")).
filter(col("match")).
count()

//(or) by using .rlike function
spark.sparkContext.textFile("/pagecounts-20160101-
000000").map(_.split(" ")).
map(c => (c(0),c(1))).
toDF("project_code","page_title").
withColumn("match", col("page_title").rlike("^The.*")).
filter(col("match")).
count()

//Long = 48684
0 голосов
/ 21 марта 2020

, если вас интересуют только строки, соответствующие критериям, используйте:

df
 .where(col("page_title").rlike("^The.*"))
 .count

, если вы хотите увидеть, сколько строк соответствует, а какие нет:

df
 .groupBy(col("page_title").rlike("^The.*"))
 .count
 .show()

Или альтернативно:

df
.groupBy()
.agg(
    count("*").as("total_count"),
    count(when(col("page_title").rlike("^The.*"),lit(1))).as("match_count")
)
.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...