例如,我有一個火花排:
Row row = ...
我可以在與除錯器的互動式會話中評估以下命令:
row.schema.fieldNamesSet.contains("title")
> true
但是,我不能寫:
assertThat(row.schema.fieldNamesSet.contains("title"))
// or
assertThat(row.schema().fieldNamesSet.contains("title"))
// etc.
// this method path is not available because it has "private access"
(一般問題,或 Y)如何斷言行中不存在 fieldName?
(具體問題或 X)如何執行行內檢查模式是否包含欄位名稱?
uj5u.com熱心網友回復:
a 的模式Row是該類的一個實體StructType,因此您可以參考該類的JavaDoc以找出您可以使用的所有公共欄位和方法。請注意,您可以使用類中定義的StructType所有方法以及從超類和介面繼承的所有方法。
特別是,要驗證架構是否包含給定的欄位名稱,您有多種選擇:
exists方法
將謂詞傳遞給exists將為每個欄位評估的方法,并true在至少一個欄位與條件匹配時回傳。如果您想評估除名稱之外的其他條件,它也很有用。
row.schema().exists(f -> "title".equals(f.name()));
getFieldIndex方法
該StructType.getFieldIndex方法回傳一個Option指向實際欄位索引(如果存在)或指向(None如果不存在)。
row.schema().getFieldIndex("title").isDefined();
您還可以使用fields()andfieldNames()方法訪問欄位或 fieldNames 陣列并處理它們,因為這對您的用例最方便。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/526114.html
標籤:爪哇阿帕奇火花
