Работа Spark долгое время безрезультатно - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть два фрейма данных, каждый из которых содержит около миллиона записей, и я хочу добавить True или false к каждой строке на основе df1 при частичном совпадении столбца с другим столбцом в df.

У меня естьРассматривал написание 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 голосов
/ 16 февраля 2019

Я думаю, ваш вариант использования очень похож на этот , где изначально есть набор значений.В вашем случае у вас уже есть датафрейм, поэтому вы можете использовать этот ответ и присоединиться к вашим фреймам данных.Что должно привести к следующему (пожалуйста, проверьте себя):

df1
.join(broadcast(df2.select("SHORT_DESC")),$"Col45".contains($"SHORT_DESC"),"left")
.withColumn("flag",$"SHORT_DESC".isNotNull)
.drop($"SHORT_DESC")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...