Spark作业长时间无结果运行

时间:2019-02-15 19:28:34

标签: scala apache-spark

我有两个数据帧,每个数据帧都有大约一百万条记录,我希望根据与另一df中的列部分匹配的列,在df1的每一行上追加True或false。

我已经考虑过编写UDF,然后比较两列中的字符串,但这不起作用

var df1 = spark.read.format("csv").option("header", "true").option("delimiter", "\t").load("hdfs://XXXXX.txt")   
var df2 = spark.read.format("csv").option("header", "true").option("delimiter", "\t").load("YYYYYYY.txt")

var desc =df2.select("SHORT_DESC").map(_.getString(0)).collect.toList
var desc_str  = desc.mkString(" ")

def matchBoth(s:String ,s1: String) : Boolean ={ 
  if(s1.contains(s)) true
  else false
}

var contains = udf(matchBoth _)    

var df3=df1.withColumn("flag",contains(lower($"Col45"),lit(desc_str.toLowerCase)))

1 个答案:

答案 0 :(得分:0)

我认为您的用例与this的用例非常相似,其中最初有一组值。在您的情况下,您已经有数据框,因此可以使用this答案并加入数据框。这应该导致以下情况(请重新检查一下自己):

df1
.join(broadcast(df2.select("SHORT_DESC")),$"Col45".contains($"SHORT_DESC"),"left")
.withColumn("flag",$"SHORT_DESC".isNotNull)
.drop($"SHORT_DESC")