Просто используйте немного currying:
def convertDateFunc(resolution: DateResolutionType) = udf((x:String) =>
SparkDateTimeConverter.convertDate(x, resolution))
и используйте его следующим образом:
case FieldDataType.Date => convertDateFunc(resolution(i))(allCols(i))
На боковой ноте вы должны взглянуть на sql.functions.trunc
и sql.functions.date_format
. Они должны по крайней мере частично выполнять работу без использования UDF вообще.
Примечание:
В Spark 2.2 или более поздней версии вы можете использовать функцию typedLit
:
import org.apache.spark.sql.functions.typedLit
, которые поддерживают более широкий диапазон литералов, таких как Seq
или Map
.
Шаблон \1
является обратной ссылкой на группу захвата 1, то есть (([0-9a-zA-Z])\1)
. Вы действительно хотите сослаться на группу захвата 2 и, таким образом, нуждаетесь в \2
вместо \1
.
Обратите внимание, что \b#
будет соответствовать только #
, которому предшествует слово char (буква, цифра или _
). Вам нужно использовать границу без слов в начале, \B
.
Для соответствия шестнадцатеричным символам предпочтительнее [A-Fa-f]
, а не [A-Za-z]
.
Используйте
@"\B#(?:([0-9a-fA-F])\1){3}\b"
. При использовании буквального строкового литерала вам не нужно использовать двойную обратную косую черту здесь.