Удалить слова из столбца, если он присутствует в списке - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть фрейм данных со столбцом text, в котором много строк, состоящих из английских предложений.

text

It is evening
Good morning
Hello everyone
What is your name
I'll see you tomorrow

У меня есть переменная типа List, в которой есть несколько слов, таких как

val removeList = List("Hello", "evening", "because", "is")

Я хочу удалить все те слова из текста столбца, которые присутствуют в removeList.

Поэтому мой вывод должен быть

It
Good morning
everyone
What your name
I'll see you tomorrow

Как я могу это сделатьиспользуя Spark Scala.

Я написал код наподобие этого:

val stopWordsList = List("Hello", "evening", "because", "is");
val df3 = sqlContext.sql("SELECT text FROM table");
val df4 = df3.map(x => cleanText(x.mkString, stopWordsList));

def cleanText(x:String, stopWordsList:List[String]):Any = {
  for(str <- stopWordsList) {
    if(x.contains(str)) {
      x.replaceAll(str, "")
    }
  }
}

Но я получаю ошибку

Error:(44, 12) Unable to find encoder for type stored in a Dataset.  Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._  Support for serializing other types will be added in future releases.
val df4 = df3.map(x => cleanText(x.mkString, stopWordsList));

Error:(44, 12) not enough arguments for method map: (implicit evidence$6: org.apache.spark.sql.Encoder[String])org.apache.spark.sql.Dataset[String].

Неуказанное значение параметра-доказательства $ 6.val df4 = df3.map (x => cleanText (x.mkString, stopWordsList));

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Проверьте это df и rdd way.

val df = Seq(("It is evening"),("Good morning"),("Hello everyone"),("What is your name"),("I'll see you tomorrow")).toDF("data")
val removeList = List("Hello", "evening", "because", "is")
val rdd2 = df.rdd.map{ x=> {val p = x.getAs[String]("data") ; val k = removeList.foldLeft(p) ( (p,t) => p.replaceAll("\\b"+t+"\\b","") ) ; Row(x(0),k) } }
spark.createDataFrame(rdd2, df.schema.add(StructField("new1",StringType))).show(false)

Выход:

+---------------------+---------------------+
|data                 |new1                 |
+---------------------+---------------------+
|It is evening        |It                   |
|Good morning         |Good morning         |
|Hello everyone       | everyone            |
|What is your name    |What  your name      |
|I'll see you tomorrow|I'll see you tomorrow|
+---------------------+---------------------+
0 голосов
/ 19 ноября 2018

Этот код работает для меня.
Spark версия 2.3.0, Scala версия 2.11.8.

Использование наборов данных

import org.apache.spark.sql.SparkSession

val data = List(
  "It is evening",
  "Good morning",
  "Hello everyone",
  "What is your name",
  "I'll see you tomorrow"
)
val removeList = List("Hello", "evening", "because", "is")

val spark = SparkSession.builder.master("local[*]").appName("test").getOrCreate()
val sc = spark.sparkContext
import spark.implicits._

def cleanText(text: String, removeList: List[String]): String =
  removeList.fold(text) {
    case (text, termToRemove) => text.replaceAllLiterally(termToRemove, "")
  }

val df1 = sc.parallelize(data).toDS // Dataset[String]
val df2 = df1.map(text => cleanText(text, removeList)) // Dataset[String]

Использование DataFrames

import org.apache.spark.sql.SparkSession

val data = List(
  "It is evening",
  "Good morning",
  "Hello everyone",
  "What is your name",
  "I'll see you tomorrow"
)
val removeList = List("Hello", "evening", "because", "is")

val spark = SparkSession.builder.master("local[*]").appName("test").getOrCreate()
val sc = spark.sparkContext
import spark.implicits._

def cleanText(text: String, removeList: List[String]): String =
  removeList.fold(text) {
    case (text, termToRemove) => text.replaceAllLiterally(termToRemove, "")
  }

// Creates a temp table.
sc.parallelize(data).toDF("text").createTempView("table")

val df1 = spark.sql("SELECT text FROM table") // DataFrame = [text: string]
val df2 = df1.map(row => cleanText(row.getAs[String](fieldName = "text"), removeList)).toDF("text") // DataFrame = [text: string]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...