在撰寫 java 代碼時,我通常使用不可變值型別。有時它是通過庫(Immutables、AutoValue、Lombok)實作的,但大多只是帶有以下內容的普通 Java 類:
- 所有
final領域 - 以所有欄位為引數的建構式
(鑒于當前的火花支持,此問題適用于 java 11 及以下版本)。
在 Spark Sql 中,資料型別需要一個Encoder. 使用現成的編碼器(如 )Encoder.bean(MyType.class),使用這種不可變資料型別會導致“非法反射訪問操作”。
我很好奇這里的 spark sql(資料集)方法是什么。顯然,我可以放松這一點,讓它成為一個可變的 pojo。
更新
查看Encoders.bean它的代碼確實必須是一個經典的、可變的 POJO。反射代碼尋找合適的 setter。此外(并記錄在案)唯一支持的集合型別是array,list和map(不是set)。
uj5u.com熱心網友回復:
這其實是誤診。我的資料型別的不變性不會導致反射訪問問題。這是一個 JVM 11 問題(主要在此處注明)https://github.com/renaissance-benchmarks/renaissance/issues/241
通過添加以下 JVM 引數,一切正常:
--illegal-access=deny --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/333879.html
標籤:爪哇 阿帕奇火花 apache-spark-sql apache-spark-数据集 apache-spark-编码器
