Spark如何从另一个数据框中过滤出包含char序列的行?

时间:2018-08-02 15:58:55

标签: scala apache-spark dataframe

因此,如果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)

但这不起作用,我并不感到惊讶,但是我认为,如果我之前的解释不够充分,它将有助于显示我正在尝试做的事情。谢谢您的帮助。

2 个答案:

答案 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