簡體   English   中英

重命名后如何檢查火花列的相等性

[英]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中修復了這也是很好的信息。)

謝謝。

我寫了一篇關於如何解決這個問題的博文

訣竅是:檢查Expression是否具有Alias特征:

`column.expr() instanceof Alias`

如果是,請使用Extractor模式解壓縮子表達式和名稱:

alias = (Alias) column.expr()
Option<Tuple2<Expression, String>> aliasTuple = Alias$.MODULE$.unapply(alias);

我做了一些挖掘,看起來在實例化新列的過程中,有關別名的Column的子信息丟失了。 也許有一個狀態可以在某處查詢,但我沒有找到它。

所以這不是一個答案,但希望它對某些人有用或有意義。

更多信息

Column對象上as方法的定義是指name函數(請參閱Column.scala ), 它只調用此處定義的Alias案例類。 Alias (及其child )不會暴露。 它直接賦予ColumnwithExpr函數,該函數根據Alias命名表達式實例化一個新列。

所以你要么直接比較列上toString的結果(丟失列來自哪里的信息,即哪個數據幀),要么實際解析由explain(true)方法打印的字符串......但它沒有對我來說似乎是明智的......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM