【问题标题】:AnalysisException: No matching function with signature: rtrim(VARCHAR(40), STRING)AnalysisException:没有具有签名的匹配函数:rtrim(VARCHAR(40),STRING)
【发布时间】:2019-11-19 07:01:13
【问题描述】:

我在表中有 58.3308% 的值(包括 % 字符),我需要 0.583308 的输出,并且下面的 SQL 查询在 SQL 控制台中可以正常工作

select to_char((rtrim('58.3308%', '%') /100), '0.999999') from dual;

但是我的 python 代码中出现了这个错误,这是一个 hive/impala 问题,对吧?

AnalysisException:没有与签名匹配的函数:rtrim(VARCHAR(40), STRING)

非常感谢您的建议

【问题讨论】:

    标签: python sql oracle hive impala


    【解决方案1】:

    根据Hive manual,rtrim 仅删除空格,因此不采用第二个参数。如果要删除其他字符,请考虑使用 regexp_replace,如 regexp_replace('58.3308%', '%', '')

    根据文档:

    rtrim(字符串 A)

    返回从结尾(右)修剪空格产生的字符串 hand side) 的 A。例如,rtrim('foobar') 结果为 'foobar'。

    regexp_replace(string INITIAL_STRING, string PATTERN, string 替换)

    返回由替换所有子字符串产生的字符串 与定义的 java 正则表达式语法匹配的 INITIAL_STRING 在带有 REPLACEMENT 实例的 PATTERN 中。例如, regexp_replace("foobar", "oo|ar", "") 返回 'fb.'请注意,有些 使用预定义的字符类时需要小心:使用 '\s' as 第二个参数将匹配字母 s; '\s' 是必要的 匹配空格等

    顺便说一句,这个操作的结果将是一个字符串,所以为了安全起见,你应该把它转换成浮点数。

    【讨论】:

    • 非常感谢您的建议,使用这个cast(regexp_replace('58.3308%', '%%', '') as decimal(20,8))*0.01,现在可以正常使用了,?☕️?
    【解决方案2】:

    你可以使用split

    select split('58.3308%', '%')[0] /100 as v
    +--------+
    |       v|
    +--------+
    |0.583308|
    +--------+
    

    【讨论】:

    • 您好,非常感谢您的回答,我收到了一个错误AnalysisException: Syntax error in line 2: ...e, split('58.3308%', '%')[0]/100 as val ^ Encountered: [ Expected: AND, AS, ASC, BETWEEN, BLOCK_SIZE, COMMENT, COMPRESSION, CROSS, DEFAULT, DESC, DIV, ELSE, ENCODING, END, FOLLOWING, FROM, FULL, GROUP, IGNORE, HAVING, ILIKE, IN, INNER, IREGEXP, IS, JOIN............. CAUSED BY: Exception: Syntax error unable to rollback
    猜你喜欢
    • 2019-06-16
    • 2022-11-16
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2017-05-20
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多