Лучший способ поиска строки в столбце в Spark DataFrame - PullRequest
1 голос
/ 06 мая 2019

Я использую 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 я вижу, что эти задания count и take занимают время.Этот фрагмент кода выполняется не менее 20 000 раз, также vSomeTable - это кадр данных, содержащий 41 000 строк.

Дайте мне знать, если вам нужна дополнительная информация, или я могу сделать то же самое по-другому с меньшим временем.

1 Ответ

1 голос
/ 06 мая 2019

Вместо нескольких заданий 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) {
  ...
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...