我正在将Apache Spark 2.2与Scala 2.11一起使用。
我有一个字符串,可以从中创建1克,2克和3克。之后,我尝试在数据框中搜索这些值。现在,此过程发生了很多次,因此整个Spark工作都需要很多时间。我应该怎么看?
以下是代码段:
// creating the n-grams
val vNGrams = for (i <- 1 to 3) yield sampleString.trim.split(" ").sliding(i).map(p => p.mkString(" "))
// converting them to a single array as above code generates three different iterators for different ngrams
val z = vNGrams.map(itr => itr.toArray).flatten.toArray
for (i <- 0 to z.length-1) {
val df = vSomeTable.select("COUNTRY_CODE").where(upper(col("ZIPCODE")) === z(i).toUpperCase)
if(df.count.toInt > 0) {
countryCode = df.take(1)(0)(0).toString
return countryCode
}
}
在Spark UI中,我看到这些count
和take
作业正在花费时间。此代码段至少运行20k次,vSomeTable
也是一个具有41k行的数据帧。
让我知道您是否需要更多信息,或者我可以用更少的时间做不同的事情。
答案 0 :(得分:1)
代替多个Spark作业,消除for循环并改为使用单个作业。另外,请避免同时使用df.count
和df.take
并使用limit 1
以便提早退出。
val z = vNGrams.flatten.map(_.toUpperCase).toArray
val rows = vSomeTable
.select("COUNTRY_CODE")
.where(upper(col("ZIPCODE")).isInCollection(z))
.limit(1)
.collect()
if (!rows.isEmpty) {
...
}