最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Presto自定義函數(shù)@SqlNullable引發(fā)問題詳解

 更新時間:2022年12月05日 11:39:21   作者:EdurtIO  
這篇文章主要為大家介紹了Presto自定義函數(shù)@SqlNullable引發(fā)問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引發(fā)Presto問題

看到標(biāo)題我們會想到是由于@SqlNullable注解引發(fā)的問題,我們先看一段代碼,正是這段有意思的代碼,讓我糾結(jié)了2個多小時,引發(fā)了Presto的問題。

@Description("user_id")
@ScalarFunction("user_id")
@SqlType(StandardTypes.VARCHAR)
public static Slice userId(@SqlType(StandardTypes.VARCHAR) Slice value) {
    String _value = value.toStringUtf8();
    if (StringUtils.containsWhitespace(_value)) {
        _value = StringUtils.replace(_value, " ", "+");
    } 
    return Slices.utf8Slice(makeErrorMsgBase64(_value));
}

這段代碼很簡單,就是我們將傳遞進(jìn)來的base64的字符串解碼成實(shí)際的字符串,單單從代碼上看是不會有什么問題的。當(dāng)我們實(shí)際運(yùn)行這個函數(shù)的時候問題就出現(xiàn)了,以下是一個使用示例:

select user_id(str) from temp.users limit 100;

看執(zhí)行的SQL似乎也沒有什么異常,但就是這么簡簡單單的一個函數(shù)引發(fā)了Presto的問題,那就是java.lang.NullPointerException: undefined錯誤

錯誤具體內(nèi)容

java.lang.NullPointerException: undefined
	at io.prestosql.type.VarcharOperators.equal(VarcharOperators.java:53)
	at io.prestosql.$gen.CursorProcessor_20200927_063218_2398.filter(Unknown Source)
	at io.prestosql.$gen.CursorProcessor_20200927_063218_2398.process(Unknown Source)
	at io.prestosql.operator.ScanFilterAndProjectOperator$RecordCursorToPages.process(ScanFilterAndProjectOperator.java:323)
	at io.prestosql.operator.WorkProcessorUtils$ProcessWorkProcessor.process(WorkProcessorUtils.java:372)
	at io.prestosql.operator.WorkProcessorUtils.getNextState(WorkProcessorUtils.java:221)
	at io.prestosql.operator.WorkProcessorUtils$YieldingProcess.process(WorkProcessorUtils.java:181)
	at io.prestosql.operator.WorkProcessorUtils$ProcessWorkProcessor.process(WorkProcessorUtils.java:372)
	at io.prestosql.operator.WorkProcessorUtils.getNextState(WorkProcessorUtils.java:221)
	at io.prestosql.operator.WorkProcessorUtils.lambda$processStateMonitor$2(WorkProcessorUtils.java:200)
	at io.prestosql.operator.WorkProcessorUtils$ProcessWorkProcessor.process(WorkProcessorUtils.java:372)
	at io.prestosql.operator.WorkProcessorUtils.lambda$flatten$6(WorkProcessorUtils.java:277)
	at io.prestosql.operator.WorkProcessorUtils$3.process(WorkProcessorUtils.java:319)
	at io.prestosql.operator.WorkProcessorUtils$ProcessWorkProcessor.process(WorkProcessorUtils.java:372)
	at io.prestosql.operator.WorkProcessorUtils$3.process(WorkProcessorUtils.java:306)
	at io.prestosql.operator.WorkProcessorUtils$ProcessWorkProcessor.process(WorkProcessorUtils.java:372)
	at io.prestosql.operator.WorkProcessorUtils.getNextState(WorkProcessorUtils.java:221)
	at io.prestosql.operator.WorkProcessorUtils.lambda$processStateMonitor$2(WorkProcessorUtils.java:200)
	at io.prestosql.operator.WorkProcessorUtils$ProcessWorkProcessor.process(WorkProcessorUtils.java:372)
	at io.prestosql.operator.WorkProcessorUtils.getNextState(WorkProcessorUtils.java:221)
	at io.prestosql.operator.WorkProcessorUtils.lambda$finishWhen$3(WorkProcessorUtils.java:215)
	at io.prestosql.operator.WorkProcessorUtils$ProcessWorkProcessor.process(WorkProcessorUtils.java:372)
	at io.prestosql.operator.WorkProcessorSourceOperatorAdapter.getOutput(WorkProcessorSourceOperatorAdapter.java:149)
	at io.prestosql.operator.Driver.processInternal(Driver.java:379)
	at io.prestosql.operator.Driver.lambda$processFor$8(Driver.java:283)
	at io.prestosql.operator.Driver.tryWithLock(Driver.java:675)
	at io.prestosql.operator.Driver.processFor(Driver.java:276)
	at io.prestosql.execution.SqlTaskExecution$DriverSplitRunner.processFor(SqlTaskExecution.java:1076)
	at io.prestosql.execution.executor.PrioritizedSplitRunner.process(PrioritizedSplitRunner.java:shichengoooo@163.com)
	at io.prestosql.execution.executor.TaskExecutor$TaskRunner.run(TaskExecutor.java:484)
	at io.prestosql.$gen.Presto_341____20200925_110330_2.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

修改UDF源碼

通過上面錯誤我們推算出應(yīng)該是由于數(shù)據(jù)導(dǎo)致空指針異常,那么問題出在哪里呢?問題就出在查詢str這個字段中,這個字段我們經(jīng)過實(shí)際的查詢發(fā)現(xiàn)是有''的數(shù)據(jù),在做轉(zhuǎn)換的時候出現(xiàn)了空指針問題,于是我們修改UDF的源碼為

@Description("user_id")
@ScalarFunction("user_id")
@SqlType(StandardTypes.VARCHAR)
@SqlNullable
public static Slice userId(@SqlNullable @SqlType(StandardTypes.VARCHAR) Slice value) {
    String _value = value.toStringUtf8();
    if (StringUtils.containsWhitespace(_value)) {
        _value = StringUtils.replace(_value, " ", "+");
    } 
    return Slices.utf8Slice(makeErrorMsgBase64(_value));
}

我們在方法和參數(shù)上添加了@SqlNullable注解用于標(biāo)記此函數(shù)可以接收空的數(shù)據(jù),這似乎看著也沒有問題,我們將該函數(shù)重新發(fā)布,再次執(zhí)行SQL發(fā)現(xiàn)還存在相同的問題,于是又將代碼修改為以下內(nèi)容

@Description("user_id")
@ScalarFunction("user_id")
@SqlType(StandardTypes.VARCHAR)
public static Slice userId(@SqlNullable @SqlType(StandardTypes.VARCHAR) Slice value) {
    String _value = value.toStringUtf8();
    if (StringUtils.containsWhitespace(_value)) {
        _value = StringUtils.replace(_value, " ", "+");
    } 
    return Slices.utf8Slice(makeErrorMsgBase64(_value));
}

刪除了方法上的@SqlNullable注解,再次運(yùn)行發(fā)現(xiàn)不會再出現(xiàn)這個錯誤,但是Presto服務(wù)中不斷的報(bào)出空指針錯誤,只是不在反饋給查詢客戶端,原本以為此問題已經(jīng)解決,然而更有意思的事情發(fā)生了,我們使用了343版本測試成功后,線上版本是341,升級線上后發(fā)現(xiàn)此問題再次復(fù)現(xiàn),如果再次在方法上加上@SqlNullable注解在341版本上又會修復(fù)這個問題,目前已將這個問題反饋給官方,推薦大家使用343版本!

以上就是Presto自定義函數(shù)@SqlNullable引發(fā)問題詳解的詳細(xì)內(nèi)容,更多關(guān)于Presto自定義函數(shù)@SqlNullable的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 前端如何調(diào)用后端接口進(jìn)行數(shù)據(jù)交互詳解(axios和SpringBoot)

    前端如何調(diào)用后端接口進(jìn)行數(shù)據(jù)交互詳解(axios和SpringBoot)

    一般來講前端不會給后端接口,而是后端給前端接口的情況比較普遍,下面這篇文章主要給大家介紹了關(guān)于前端如何調(diào)用后端接口進(jìn)行數(shù)據(jù)交互的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Java線程之間通信的幾種方式詳解

    Java線程之間通信的幾種方式詳解

    在 Java 中,線程之間的通信是通過共享內(nèi)存模型來實(shí)現(xiàn)的,線程通過共享的對象和變量來交換數(shù)據(jù),為了確保線程間通信的正確性,Java 提供了一系列機(jī)制來實(shí)現(xiàn)線程安全、同步和通信,以下是常用的幾種線程間通信的方式,以及它們的使用方法和場景,需要的朋友可以參考下
    2025-03-03
  • SpringBoot配置加載,各配置文件優(yōu)先級對比方式

    SpringBoot配置加載,各配置文件優(yōu)先級對比方式

    這篇文章主要介紹了SpringBoot配置加載,各配置文件優(yōu)先級對比方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中NIO的三大核心組件詳細(xì)解析

    Java中NIO的三大核心組件詳細(xì)解析

    這篇文章主要介紹了Java中NIO的三大核心組件詳細(xì)解析,NIO的Buffer類是一個抽象類,位于java.nio包中,提供了一組更加有效的方法,用來進(jìn)行寫入和讀取的交替訪問,本質(zhì)上是一個內(nèi)存塊,既可以寫入數(shù)據(jù),也可以從中讀取數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • MyBatis Plus Mapper CRUD接口測試方式

    MyBatis Plus Mapper CRUD接口測試方式

    在數(shù)據(jù)庫管理系統(tǒng)中,插入記錄是添加新數(shù)據(jù)條目,而刪除操作包括根據(jù)主鍵ID單條刪除和批量刪除,也可以基于特定條件進(jìn)行刪除,刪除操作的SQL語句是通過鍵值對在Map中拼接而成,如delete from 表 where key1=value1 AND key2=value2
    2024-09-09
  • SpringBoot使用PageHelper分頁詳解

    SpringBoot使用PageHelper分頁詳解

    這篇文章主要介紹了SpringBoot使用PageHelper分頁詳解,我們在任何的系統(tǒng)中,分頁功能是必不可少的,然而,對于這個功能如果有一種快速開發(fā)的實(shí)現(xiàn)方式,當(dāng)然可以節(jié)省我們很多的時間了,接下來,我就給大家基于不同的環(huán)境來說說如何使用一個分頁插件,需要的朋友可以參考下
    2023-10-10
  • Dubbo+zookeeper搭配分布式服務(wù)的過程詳解

    Dubbo+zookeeper搭配分布式服務(wù)的過程詳解

    Dubbo作為分布式架構(gòu)比較后的框架,同時也是比較容易入手的框架,適合作為分布式的入手框架,下面是簡單的搭建過程,對Dubbo+zookeeper分布式服務(wù)搭建過程感興趣的朋友一起看看吧
    2022-04-04
  • Java中MessageDigest來實(shí)現(xiàn)數(shù)據(jù)加密的方法

    Java中MessageDigest來實(shí)現(xiàn)數(shù)據(jù)加密的方法

    這篇文章主要介紹了Java中MessageDigest來實(shí)現(xiàn)數(shù)據(jù)加密的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳解java中spring里的三大攔截器

    詳解java中spring里的三大攔截器

    在本篇文章里我們給大家詳細(xì)講述了java中spring里的三大攔截器相關(guān)知識點(diǎn)以及用法代碼,需要的朋友們學(xué)習(xí)下。
    2018-10-10
  • mapper接口注入兩種方式詳解

    mapper接口注入兩種方式詳解

    這篇文章主要介紹了mapper接口注入兩種方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評論

济阳县| 沿河| 连云港市| 克什克腾旗| 政和县| 利川市| 巴马| 仪陇县| 万年县| 尼木县| 民勤县| 佛坪县| 和硕县| 和静县| 林西县| 鄯善县| 岑溪市| 大竹县| 微山县| 绍兴市| 拜城县| 马边| 内黄县| 故城县| 景宁| 芮城县| 全州县| 涞水县| 包头市| 榆中县| 夏邑县| 离岛区| 来宾市| 叶城县| 元江| 文山县| 天台县| 平度市| 大理市| 钟祥市| 永平县|