Scala 如果列表中有单词,请从列中删除

Scala 如果列表中有单词,请从列中删除,scala,apache-spark,Scala,Apache Spark,我有一个带有“text”列的数据框,其中有许多行由英语句子组成 正文 我有一个List类型的变量,它有一些单词,比如 val removeList = List("Hello", "evening", "because", "is") 我想从列文本中删除removeList中存在的所有单词 所以我的输出应该是 It Good morning everyone What your name I'll see you tomorrow 如何使用Spark Scala实现这一点 我写了一段类似这样

我有一个带有“text”列的数据框,其中有许多行由英语句子组成

正文

我有一个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, "")
    }
  }
}
未指定值参数证据$6。
val df4=df3.map(x=>cleanText(x.mkString,stopWordsList))

这段代码对我有效。
Spark版本
2.3.0
Scala版本
2.11.8

使用数据集 使用数据帧
检查此df和rdd方式

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|
+---------------------+---------------------+

嗨,欢迎来到StackOverflow。你可以看看这个来改进这个问题。特别是,你应该提供一些研究工作和/或一些代码来探索你已经试图自己解决的问题。好的,谢谢你让我知道。我用我尝试过的方法更新了它。给定
sqlContext.sql
返回数据帧而不是数据集,您有三个选项。一种是像在代码中一样使用
mkString
,将行转换为字符串。第二次在行上使用
getAs[String](“text”)
getString(0)
,以选择第一个(“text”)列值。第三,使用
as[String]
方法将数据帧转换为数据集[String]。我尝试了选项1、2和3。我在cmd(Windows)中提交了spark版本,这三个版本都出现了相同的错误“无法找到数据集中存储类型的编码器”,它显示了spark版本2.3.0和Scala 2.11。我在pom.xml 2.3 2.11.0 2.11@Nick中有这些属性,我已经更新了答案,提供了一个使用数据帧和
sql
方法的示例,它对我很有用。试着在spark shell中运行我的小示例,可能错误是由代码的其他部分引起的-请记住,如果在spark shell中运行它,则不需要创建SparkSession(
spark
)或SparkContext(
sc
),但是你仍然需要导入spark.implicits.\u。谢谢@Luis Miguel Mejía Suárez,我的IntelliJ IDEA中有完全相同的代码,但它无法运行,给了我与上面提到的相同的错误,不知道为什么。add import org.apache.spark.sql.\uz对于行objectGreat,这很有效!我只做了一个小改动(p,t)=>p.replaceAll(“\\b”+t+“\\b”,”)。replaceAlltry将替换所有出现的内容,而只有当它是一个完整的单词时才应该替换。例如,如果我的列表中有“a”,那么所有出现的“a”都将被替换,而只有当它本身是一个单词时,它才应该被替换。我还做了一个更改,可能会帮助某人:(p,t)=>p.replaceAll(\\b“+t+”\\b“,”).replaceAll(“+”,”)。“全部替换”的附加功能是将多个空间删除/转换为单个空间。如果替换了多个单词,则可能发生这种情况。您还可以添加额外的.replaceAll(“[\p{Punct}&&[^.]]”,以删除标点。在Int类型的数据框架中,我还有一个名为rating的列。我们目前正在执行x=>{val p=x.getAs[String](“data”);假设我们只有一个名为data的列。我还需要哪些更改来适应此更改?
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]
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]
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|
+---------------------+---------------------+