我有以下帶有 2 列的資料框。
--------- -----------------
|column_a |column_b |
--------- -----------------
|text book|Music Book Movie |
|book |BOOK Film Theatre|
|note book|Music Movie Drama|
|rock |Pop Metal Jazz |
|hard rock|Blues Rap Rock |
--------- -----------------
我必須過濾掉 column_b 中存在 column_a 中的任何單詞/標記的行。
例如:
text book應該被過濾掉,因為column_b 第一行中存在textor 。book
同樣,hard rock也應該被過濾掉,因為column_b 中存在hardor 。rock
第二行book也應該被過濾掉,因為這個詞BOOK出現在 column_b 中。
所以我的輸出資料框只是:
--------- -----------------
|column_a |column_b |
--------- -----------------
|note book|Music Movie Drama|
|rock |Pop Metal Jazz |
--------- -----------------
我可以根據這樣的文本值進行過濾 -
val columnA = "text book"
val columnB = "Music Book Movie"
val tokensColumnA = columnA.split("\\s ").map(v => v.toLowerCase()).toSet
val tokensColumnB = columnB.split("\\s ").map(v => v.toLowerCase()).toSet
val check: Boolean = if (tokensColumnA.intersect(tokensColumnB).size == 0) true else false
但我不確定如何將其合并到 Spark 資料幀中并進行相應的過濾。
uj5u.com熱心網友回復:
import org.apache.spark.sql.functions.{col, udf}
import spark.implicits._
case class D(column_a: String, column_b: String)
val df1 = Seq(
D("text book", "Music Book Movie"),
D("book", "BOOK Film Theatre"),
D("note book", "Music Movie Drama"),
D("rock", "Pop Metal Jazz"),
D("hard rock", "Blues Rap Rock")
).toDF()
df1.show(false)
// --------- -----------------
// |column_a |column_b |
// --------- -----------------
// |text book|Music Book Movie |
// |book |BOOK Film Theatre|
// |note book|Music Movie Drama|
// |rock |Pop Metal Jazz |
// |hard rock|Blues Rap Rock |
// --------- -----------------
val checkUDF = udf((columnA: String, columnB: String) => {
val tokensColumnA = columnA.split("\\s ").map(v => v.toLowerCase()).toSet
val tokensColumnB = columnB.split("\\s ").map(v => v.toLowerCase()).toSet
if (tokensColumnA.intersect(tokensColumnB).size == 0) true else false
})
val tmpDF = df1.withColumn("isCorect", checkUDF(col("column_a"), col("column_b")))
tmpDF.show(false)
// --------- ----------------- --------
// |column_a |column_b |isCorect|
// --------- ----------------- --------
// |text book|Music Book Movie |false |
// |book |BOOK Film Theatre|false |
// |note book|Music Movie Drama|true |
// |rock |Pop Metal Jazz |true |
// |hard rock|Blues Rap Rock |false |
// --------- ----------------- --------
val resDF = tmpDF.filter(col("isCorect") === true)
resDF.show(false)
// --------- ----------------- --------
// |column_a |column_b |isCorect|
// --------- ----------------- --------
// |note book|Music Movie Drama|true |
// |rock |Pop Metal Jazz |true |
// --------- ----------------- --------
val df = resDF.drop(col("isCorect"))
df.show(false)
// --------- -----------------
// |column_a |column_b |
// --------- -----------------
// |note book|Music Movie Drama|
// |rock |Pop Metal Jazz |
// --------- -----------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481488.html
標籤:数据框 斯卡拉 阿帕奇火花 apache-spark-sql
