[英]How to check equality of spark columns after renaming
我正在嘗試為Java Spark-Sql應用程序編寫一些測試。 我需要測試的一個操作重命名一個列,我遇到了一些困難,比較了重命名列的實際值和我的預期值。 經過一些實驗,我能夠編寫以下兩個測試來證明問題:
首先,作為一個完整性檢查,我嘗試了這個(df是一個spark sql DataFrame
,通過讀取我正在測試的json文件中的一些示例數據生成):
@Test
public void testColumnEquality() throws Exception {
Column val1 = df.col("col2");
Column val2 = df.col("col2");
Assert.assertEquals(val1, val2);
}
正如人們所期望的那樣,哪個通過。 然后我嘗試了這個:
@Test
public void testReanmeColumnEquality() throws Exception {
Column val1 = df.col("col2").as("col2");
Column val2 = df.col("col2").as("col2");
Assert.assertEquals(val1, val2);
}
失敗並出現錯誤java.lang.AssertionError: expected:<col2 AS col2#4L> but was:<col2 AS col2#5L>
在scala代碼中挖掘(完全披露 - 我知道很少scala),看起來這與NamedExpression
唯一ID有關。
有沒有辦法合理地檢查這兩列是否代表相同別名的相同操作?
(我正在使用spark 1.6,理想情況下會喜歡該版本系列的解決方案,但如果在2.0中修復了這也是很好的信息。)
謝謝。
我做了一些挖掘,看起來在實例化新列的過程中,有關別名的Column
的子信息丟失了。 也許有一個狀態可以在某處查詢,但我沒有找到它。
所以這不是一個答案,但希望它對某些人有用或有意義。
更多信息
Column
對象上as
方法的定義是指name
函數(請參閱Column.scala ), 它只調用此處定義的Alias
案例類。 Alias
(及其child
)不會暴露。 它直接賦予Column
類withExpr
函數,該函數根據Alias
命名表達式實例化一個新列。
所以你要么直接比較列上toString
的結果(丟失列來自哪里的信息,即哪個數據幀),要么實際解析由explain(true)
方法打印的字符串......但它沒有對我來說似乎是明智的......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.