【问题标题】:Spark job running without result for longSpark作业长时间无结果运行
【发布时间】:2019-02-17 16:47:45
【问题描述】:

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

我考虑过编写一个 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)))

【问题讨论】:

  • 您的数据集有多大,什么是“长期”?你得到结果了吗?
  • 我的数据集有 200 万条记录,我之前没有得到任何结果。 Gorros 的建议对我有用。

标签: scala apache-spark


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2020-04-26
    • 2022-01-18
    相关资源
    最近更新 更多