在Spark DataFrame

时间:2019-05-06 14:06:59

标签: scala apache-spark apache-spark-sql

我正在将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中,我看到这些counttake作业正在花费时间。此代码段至少运行20k次,vSomeTable也是一个具有41k行的数据帧。

让我知道您是否需要更多信息,或者我可以用更少的时间做不同的事情。

1 个答案:

答案 0 :(得分:1)

代替多个Spark作业,消除for循环并改为使用单个作业。另外,请避免同时使用df.countdf.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) {
  ...
}