我的spark执行失败,并显示AnalysisException: Undefined function: 'to_char'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 2 pos 18
,因为它无法识别我的jar中的UDF,而jar是在调用spark commit和启动JVM之后添加的。
我的工作流程如下:
sparkConfiguration.set("spark.jars", "s3://somejar")
之类的jar(EMR步骤日志显示该jar已成功添加)s3://somejar
中使用UDF并失败,并表示找不到UDF 我阅读了Spark 2.2文档(https://spark.apache.org/docs/2.2.1/configuration.html#runtime-environment),它说spark配置spark.jars
应该将列出的jar添加到驱动程序和所有worker节点,但似乎jar不是在节点的类路径中,即使spark上下文中的参数是新鲜的。让我兴奋的部分是,其他配置(例如spark.driver.extraClassPath
)的描述中有一条注释,说您不能在JVM启动后将其添加到spark上下文中,但是该注释不存在spark.jars
,让我觉得这样做是可以的。
我认为,如果我使用jars作为参数重新提交spark-submit,则UDF将在节点上被识别,因为所有内容都将在JVM启动时放在类路径中,但是我不想去做。是否可以将jars添加到已经在客户端模式下提交了火花的应用程序中?