Существует открытая проблема в Spark JIRA, чтобы решить эту проблему - SPARK-20525 Причиной этой проблемы было несовпадение загрузчика искровых классов при загрузке Spark UDF.
Разрешение этого состоит в том, чтобы загрузить ваш сеанс искры после вашего переводчика. Пожалуйста, найдите пример кода. Также вы можете сослаться на мой github например SparkCustomTransformations
trait CustomTransformations extends Serializable {
def execute(spark: SparkSession, df: DataFrame, udfFunctions: AnyRef*): DataFrame
}
// IMPORTANT spark session should be lazy evaluated
lazy val spark = getSparkSession
def getInterpretor: scala.tools.nsc.interpreter.IMain = {
import scala.tools.nsc.GenericRunnerSettings
import scala.tools.nsc.interpreter.IMain
val cl = ClassLoader.getSystemClassLoader
val conf = new SparkConf()
val settings = new GenericRunnerSettings(println _)
settings.usejavacp.value = true
val intp = new scala.tools.nsc.interpreter.IMain(settings, new java.io.PrintWriter(System.out))
intp.setContextClassLoader
intp.initializeSynchronous
intp
}
val intp = getInterpretor
val udf_str =
"""
(str:String)=>{
str.toLowerCase
}
"""
val customTransStr =
"""
|import org.apache.spark.SparkConf
|import org.apache.spark.sql.{DataFrame, SparkSession}
|import org.apache.spark.sql.functions._
|
|new CustomTransformations {
| override def execute(spark: SparkSession, df: DataFrame, func: AnyRef*): DataFrame = {
|
| //reading your UDF
| val str_lower_udf = spark.udf.register("str_lower", func(0).asInstanceOf[Function1[String,String]])
|
| df.createOrReplaceTempView("df")
| val df_with_UDF_cols = spark.sql("select a.*, str_lower(a.fakeEventTag) as customUDFCol1 from df a").withColumn("customUDFCol2", str_lower_udf(col("fakeEventTag")))
|
| df_with_UDF_cols.show()
| df_with_UDF_cols
| }
|}
""".stripMargin
intp.interpret(udf_str)
var udf_obj = intp.eval(udf_str)
val eval = new com.twitter.util.Eval
val customTransform: CustomTransformations = eval[CustomTransformations](customTransStr)
val sampleSparkDF = getSampleSparkDF
val outputDF = customTransform.execute(spark, sampleSparkDF, udf_obj)
outputDF.printSchema()
outputDF.show()
Оценка флеш-карты: обычно, флеш-карты используют одно из семейства FAT файловых систем; FAT не поддерживает безопасность вообще, поэтому как только Вы копируете файл в него, информация о безопасности потеряна. Таким образом для Вашего первого вопроса, любой, у кого есть флеш-карта, может считать ее на любом компьютере от любой учетной записи пользователя. Возможно отформатировать флеш-карты с помощью другой файловой системы (например, NTFS, который действительно поддерживает безопасность); в этом случае, если учетные записи (в Windows, по крайней мере, это должна быть учетная запись домена или подобный, просто назвав две учетных записи, то же не сделает этого), не существуют на целевом компьютере, только пользователь, который может проигнорировать полномочия файловой системы (такие как корень на *отклоняют или Администратор в Windows) сможет получить доступ к файлу.
Для второго я не на 100% уверен, но я полагаю, что это зависит от того, как Вы копируете его; вещи как FTP и rcp обычно не копируют полномочия, таким образом, я предположил бы, что файл получает некоторые полномочия по умолчанию для целевого каталога или значение по умолчанию, встроенное в программу копии, в зависимости от того, что делает программа копии.
Для окон насколько я знаю дескриптор безопасности первоначально наследован от целевой папки; полномочия, снова, не сохраняются через машины. Это может быть изменено после копии.
В целом, кроме определенных сред, которые разработаны для передачи полномочий, я предположил бы, что передача любого файла от одного компьютера до другого сбрасывает права доступа к значению по умолчанию (обычно независимо от того, что новый файл в том месте получил бы).
как технофил сказал, съемные диски обычно используют файловые системы FAT, таким образом, никакая информация о разрешении не копируется вообще.
на более 'прямых' копиях между *отклоняют машины, если запись выполняется под корнем, обычно существуют флаги для сохранения битов полномочий и владельца/группы. также, большинство из них сохраняет идентификационные данные пользователя/группы числами. если нет никакой 'глобальной' пользовательской базы данных идентификационных данных (LDAP, NIS или даже AD), несомненно, будут искать 'по имени' идентификационные данные.
некоторые примеры: