Почему создание этого UDF намного быстрее в PySpark, чем в Scala Spark? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть скрипт Python:

import time

from pyspark.sql.types import StringType
from pyspark.sql.functions import udf

from urllib.parse import urlsplit, unquote


def extractPath(host, url):
    if host in url:
        return urlsplit(url).path
    else:
        return '-'

startCreateUdfs = time.time()
getPathUdf = udf(extractPath, StringType())
endCreateUdfs = time.time()

print("Python udf creation time: {}".format(endCreateUdfs - startCreateUdfs))

и скрипт Scala:

import java.net.URLDecoder
import java.nio.charset.StandardCharsets
import java.net.URL

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.udf

object UdfTimes extends App{

  val spark = SparkSession.builder().master("local").getOrCreate()

  spark.sparkContext.setLogLevel("ERROR")

  val extractPath: (String, String) => String = (host, url) => {
    if (url.contains(host))
      new URL(url).getPath
    else
      "-"
  }
  val unquote: String => String = str => URLDecoder.decode(str, StandardCharsets.UTF_8.name())

  val startTimeUdf = System.nanoTime()
  val getPathUdf = udf(extractPath)
  val endTimeUdf = System.nanoTime()

  println("Scala udf registering time: " + (endTimeUdf - startTimeUdf) / math.pow(10, 9))
}

Который я написал, чтобы сделать то же самое. Создание udf мгновенно в Python (из командной строки):

Python udf creation time: 2.0503997802734375e-05

но в Scala это занимает почти секунду (командная строка sbt):

udf registering time: 0.768687091

В чем причина такой большой разницы?

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