【问题标题】:org.apache.spark.sql.AnalysisException: Undefined function: 'ano'org.apache.spark.sql.AnalysisException:未定义函数:'ano'
【发布时间】:2021-06-19 06:15:24
【问题描述】:

我在 spark 3.0.0 中收到此错误:

错误1:

org.apache.spark.sql.AnalysisException:未定义函数:'ano'。 此函数既不是注册的临时函数,也不是 在数据库“sspkeyspace”中注册的永久功能。 1号线 位置 58

我在 Cassandra DB 3.11.9 中创建了一个 UDF 来提取日期列的年份:

CREATE OR REPLACE FUNCTION ano (input DATE)
RETURNS NULL ON NULL INPUT RETURNS TEXT
LANGUAGE java AS 'return input.toString().substring(0,4);';

我在 cqlsh 提示符下运行了查询:

select  ano(data_compra) as ano from Compras ;

而且效果很好。然而在spark中,进入应用程序,却显示了ERRO1。

在cql提示符下查询结果:

ano
-----
2014
2009
2013
2012
2014
2012
2011
2019

谢谢,

【问题讨论】:

    标签: apache-spark cassandra apache-spark-sql cql cqlsh


    【解决方案1】:

    它不会以这种方式工作 - 当您在 Spark 中执行 select ano(data_compra) as ano from Compras 时,它会将 ano 函数视为 Spark 函数,而不是 Cassandra UDF 函数。

    不幸的是,要将 UDF 公开给 Spark SQL,您需要为 Spark Cassandra 连接器本身编写一些代码。相反,最好在 Spark 本身中重新实现所需的功能,只需将 ano 调用替换为对内置 Spark substring 的调用 - 它可能会更高性能。

    【讨论】:

    • 感谢分享链接。我需要先转换日期,然后再使用子字符串。它是如此之大,但它的作品。函数:substring(TO_DATE(CAST(UNIX_TIMESTAMP(data_compra, 'yyyy-MM-dd') AS TIMESTAMP)),1,4) as an。
    • @LucianaOliveira 看来您想从日期中获取年份,然后在 spark 中只需使用 year 函数:select year(data_compra) as ano from Compras(不需要子字符串)
    • 同意@blackbishop - 如果您的日期格式正确,那么year 会更好
    • @blackbishop,感谢您的回复。我将表达式更改为“年”。现在好多了。我很感激。
    【解决方案2】:

    检查你的函数在哪里注册,如果是,使用这个命令:

    SHOW USER FUNCTIONS;
    

    如果已注册,则使用根目录。访问该功能:

    默认是:

    select  default.ano(data_compra) as ano from Compras ;
    

    【讨论】:

    • @itlsNaz,我运行了“显示用户功能;”在 cqlsh 提示符下执行命令并返回此消息:“不正确的 SHOW 命令。” .我使用了“描述函数”;命令并返回我创建的函数。都在根目录中。
    • 不,你需要在 spark udf 中找到函数,顺便说一下,我想你知道要集成 spark 和 cassandra,你需要一个连接器,如果你没有看到我在说什么,你需要要配置您的连接器,请查看此链接:github.com/datastax/spark-cassandra-connector/blob/master/doc/…,配置连接器后使用 spark.sql(""" your query """) 它将起作用。
    • 感谢分享链接。我配置了连接器,但您的回放帮助我找到了答案。我在 sql.spark 中使用了这个函数: substring(TO_DATE(CAST(UNIX_TIMESTAMP(data_compra, 'yyyy-MM-dd') AS TIMESTAMP)),1,4) 作为 ano。
    • 但这不是我的初始问题。我正在将 SQL 查询(关系 BD)转换为 CQL 查询(cassandra+spark)。而在 SQL 中,该函数是原生的,而且非常简单。但是字符串中的转换器(在火花中)是 kkkk 的解决方案。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多