亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

引發(fā)Presto問(wèn)題

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

@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));
}

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

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

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

錯(cuò)誤具體內(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源碼

通過(guò)上面錯(cuò)誤我們推算出應(yīng)該是由于數(shù)據(jù)導(dǎo)致空指針異常,那么問(wèn)題出在哪里呢?問(wèn)題就出在查詢(xún)str這個(gè)字段中,這個(gè)字段我們經(jīng)過(guò)實(shí)際的查詢(xún)發(fā)現(xiàn)是有''的數(shù)據(jù),在做轉(zhuǎn)換的時(shí)候出現(xiàn)了空指針問(wè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));
}

我們?cè)诜椒ê蛥?shù)上添加了@SqlNullable注解用于標(biāo)記此函數(shù)可以接收空的數(shù)據(jù),這似乎看著也沒(méi)有問(wèn)題,我們將該函數(shù)重新發(fā)布,再次執(zhí)行SQL發(fā)現(xiàn)還存在相同的問(wè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)不會(huì)再出現(xiàn)這個(gè)錯(cuò)誤,但是Presto服務(wù)中不斷的報(bào)出空指針錯(cuò)誤,只是不在反饋給查詢(xún)客戶(hù)端,原本以為此問(wèn)題已經(jīng)解決,然而更有意思的事情發(fā)生了,我們使用了343版本測(cè)試成功后,線上版本是341,升級(jí)線上后發(fā)現(xiàn)此問(wèn)題再次復(fù)現(xiàn),如果再次在方法上加上@SqlNullable注解在341版本上又會(huì)修復(fù)這個(gè)問(wèn)題,目前已將這個(gè)問(wèn)題反饋給官方,推薦大家使用343版本!

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

相關(guān)文章

  • Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換

    Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換

    Java語(yǔ)言中字符串類(lèi)型和字節(jié)數(shù)組類(lèi)型相互之間的轉(zhuǎn)換經(jīng)常發(fā)生,網(wǎng)上的分析及代碼也比較多,這篇文章將主要介紹Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-10-10
  • SpringBoot+MinIO實(shí)現(xiàn)文件上傳、讀取、下載、刪除的使用示例

    SpringBoot+MinIO實(shí)現(xiàn)文件上傳、讀取、下載、刪除的使用示例

    本文主要介紹了SpringBoot+MinIO實(shí)現(xiàn)文件上傳、讀取、下載、刪除的使用示例,詳細(xì)介紹每個(gè)功能實(shí)現(xiàn)的步驟和代碼示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java實(shí)現(xiàn)的自定義迭代器功能示例

    Java實(shí)現(xiàn)的自定義迭代器功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的自定義迭代器功能,結(jié)合具體實(shí)例形式分析了java簡(jiǎn)單迭代器的實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • java頁(yè)面中文亂碼的解決辦法

    java頁(yè)面中文亂碼的解決辦法

    做java開(kāi)發(fā)的朋友碰到最多的就是中文亂碼這個(gè)問(wèn)題了,下面介紹頁(yè)面提交時(shí)與url中文亂碼的一些解決辦法
    2013-11-11
  • SpringBoot SSE服務(wù)端主動(dòng)推送事件的實(shí)現(xiàn)

    SpringBoot SSE服務(wù)端主動(dòng)推送事件的實(shí)現(xiàn)

    本文主要介紹了SpringBoot SSE服務(wù)端主動(dòng)推送事件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 通過(guò)dom4j解析xml字符串(示例代碼)

    通過(guò)dom4j解析xml字符串(示例代碼)

    本篇文章主要是對(duì)通過(guò)dom4j解析xml字符串的示例代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • Feign調(diào)用中的兩種Header傳參方式小結(jié)

    Feign調(diào)用中的兩種Header傳參方式小結(jié)

    這篇文章主要介紹了Feign調(diào)用中的兩種Header傳參方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 詳解阿里云maven鏡像庫(kù)配置(gradle,maven)

    詳解阿里云maven鏡像庫(kù)配置(gradle,maven)

    這篇文章主要介紹了詳解阿里云maven鏡像庫(kù)配置(gradle,maven),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • java遞歸處理單位人員組織機(jī)構(gòu)樹(shù)方式

    java遞歸處理單位人員組織機(jī)構(gòu)樹(shù)方式

    這篇文章主要介紹了java遞歸處理單位人員組織機(jī)構(gòu)樹(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring Boot 微信小程序接入微信支付功能

    Spring Boot 微信小程序接入微信支付功能

    本文詳細(xì)介紹了使用SpringBoot框架接入微信支付的全流程,包括導(dǎo)入依賴(lài)、配置微信公眾號(hào)信息、設(shè)置配置文件、編寫(xiě)支付相關(guān)實(shí)體類(lèi)和API地址常量、實(shí)現(xiàn)支付服務(wù)以及Controller層的編寫(xiě),感興趣的朋友跟隨小編一起看看吧
    2024-09-09

最新評(píng)論