因此,如果df2中的值“类似于” df1中的键,则尝试从df2中删除行。我不确定这是否可行,或者我是否首先需要将df1更改为列表?这是一个相当小的数据帧,但是正如您所看到的,我们想从df2中删除第二行和第三行,而只返回没有它们的df2。
df1
+--------------------+
| key|
+--------------------+
| Monthly Beginning|
| Annual Percentage|
+--------------------+
df2
+--------------------+--------------------------------+
| key| Value|
+--------------------+--------------------------------+
| Date| 1/1/2018|
| Date| Monthly Beginning on Tuesday|
| Number| Annual Percentage Rate for...|
| Number| 17.5|
+--------------------+--------------------------------+
我以为会是这样?
df.filter(($"Value" isin (keyDf.select("key") + "%"))).show(false)
但这不起作用,我并不感到惊讶,但是我认为,如果我之前的解释不够充分,它将有助于显示我正在尝试做的事情。谢谢您的帮助。
答案 0 :(得分:1)
将第一个dataframe
df1
转换为List[String]
,然后创建一个udf
并应用filter
条件
火花壳-
import org.apache.spark.sql.functions._
//Converting df1 to list
val df1List=df1.select("key").map(row=>row.getString(0).toLowerCase).collect.toList
//Creating udf , spark stands for spark session
spark.udf.register("filterUDF", (str: String) => df1List.filter(str.toLowerCase.contains(_)).length)
//Applying filter
df2.filter("filterUDF(Value)=0").show
//output
+------+--------+
| key| Value|
+------+--------+
| Date|1/1/2018|
|Number| 17.5|
+------+--------+
Scala-IDE-
val sparkSession=SparkSession.builder().master("local").appName("temp").getOrCreate()
val df1=sparkSession.read.format("csv").option("header","true").load("C:\\spark\\programs\\df1.csv")
val df2=sparkSession.read.format("csv").option("header","true").load("C:\\spark\\programs\\df2.csv")
import sparkSession.implicits._
val df1List=df1.select("key").map(row=>row.getString(0).toLowerCase).collect.toList
sparkSession.udf.register("filterUDF", (str: String) => df1List.filter(str.toLowerCase.contains(_)).length)
df2.filter("filterUDF(Value)=0").show
答案 1 :(得分:0)
将df1转换为List。将df2转换为数据集。
case class s(key:String,Value:String)
df2Ds = df2.as[s]
然后,我们可以使用filter方法过滤出记录。 像这样。
def check(str:String):Boolean = {
var i = ""
for(i<-df1List)
{
if(str.contains(i))
return false
}
return true
}
df2Ds.filter(s=>check(s.Value)).collect