未将列值正确传递到hive udf spark scala

eiee3dmh  于 2022-11-05  发布在  Hive
关注(0)|答案(2)|浏览(170)

我已经创建了一个像下面这样的hive udf,

Class customUdf extends UDF{
def evaluate(col : String): String = {
return col + "abc"
}
}

然后,我在sparksession中注册了udf,

sparksession.sql("""CREATE TEMPORARY FUNCTION testUDF AS 'testpkg.customUdf'""");

当我尝试在scala代码中使用下面的查询来查询hive表时,它没有进展,也没有抛出错误,

SELECT testUDF(value) FROM t;

然而,当我从scala代码中传递如下字符串时,它就可以工作了

SELECT testUDF('str1') FROM t;

我正在通过sparksession运行查询。尝试使用GenericUdf,但仍然遇到相同的问题。只有当我传递hive列时才会发生这种情况。可能是什么原因呢?

tsm1rwdh

tsm1rwdh1#

尝试从hdfs引用您的jar:

create function testUDF as 'testpkg.customUdf' using jar 'hdfs:///jars/customUdf.jar';
k5ifujac

k5ifujac2#

我不确定在Scala中是否实现了UDF,但当我在Java中遇到类似问题时,我注意到了一个区别,即如果插入literal,

select udf("some literal value")

则UDF会将其作为字符串接收。但当您从配置单元表中选择

select udf(some_column) from some_table

您可能会得到一个称为LazyString的值,您需要使用getObject来检索它的实际值。

相关问题