У меня есть скрипт 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
В чем причина такой большой разницы?