1 回答

TA貢獻1830條經驗 獲得超9個贊
不幸的是,Java 類型推斷并不總是非常聰明,所以我在這些情況下所做的是提取我的 lambda 的所有位作為變量,直到我找到一個 Java 無法為其提供準確類型的位。然后我給表達式我認為它應該具有的類型,看看為什么 Java 會抱怨它。有時它只是編譯器的一個限制,您必須顯式地將表達式“轉換”為所需的類型,有時您會發現代碼存在問題。在你的情況下,代碼對我來說很好,所以一定有別的東西。
然而,我有一個評論:在這里你支付一次 JSON 序列化(從Status
JSON 字符串)然后反序列化(從 JSON 字符串到Row
)的成本。另外,您沒有向您提供任何架構Dataset
,因此它必須兩次傳遞數據(或根據您的配置對其進行采樣)以推斷架構。如果數據很大,所有這些都可能非常昂貴。如果性能是一個問題并且相對簡單,我建議您直接編寫從Status
到的轉換。Row
Status
另一個“順便說一句”:您正在隱式序列化您的ObjectMapper
,很可能您不想這樣做??雌饋碓擃惔_實支持 Java 序列化,但具有特殊的邏輯。由于 Spark 的默認配置是使用 Kryo(其性能比 Java 序列化好得多),我懷疑它在使用默認FieldSerializer
.?您有以下三種選擇:
使對象映射器靜態化以避免序列化它
配置您的 Kryo 注冊器以
ObjectMapper
使用 Java 序列化序列化/反序列化類型的對象。那會起作用,但不值得付出努力。到處使用 Java 序列化而不是 Kryo。餿主意!它很慢并且占用大量空間(內存和磁盤取決于序列化對象的寫入位置)。
添加回答
舉報