Java 重命名后如何检查火花柱的相等性

Java 重命名后如何检查火花柱的相等性,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,我正在尝试为Java Spark Sql应用程序编写一些测试。我需要测试的一个操作重命名了一列,我在比较重命名列的实际值和预期值时遇到了一些困难。经过一些实验,我能够编写以下两个测试来演示问题: 首先,作为健全性检查,我尝试了以下方法(df是一个sparksqlDataFrame,通过从我测试的json文件中读取一些样本数据生成): 正如人们所预料的那样,这一切都过去了。然后我试了一下: @Test public void testReanmeColumnEquality() throw

我正在尝试为Java Spark Sql应用程序编写一些测试。我需要测试的一个操作重命名了一列,我在比较重命名列的实际值和预期值时遇到了一些困难。经过一些实验,我能够编写以下两个测试来演示问题:

首先,作为健全性检查,我尝试了以下方法(df是一个sparksql
DataFrame
,通过从我测试的json文件中读取一些样本数据生成):

正如人们所预料的那样,这一切都过去了。然后我试了一下:

  @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:but:

仔细研究scala代码(完全公开-我对scala了解很少),看起来这与
namedPression
unique id有关

有没有办法明智地检查这两列是否用相同的别名表示相同的操作

(我在spark 1.6中工作,理想情况下希望该版本线有一个解决方案,但如果这在2.0中得到修复,这也是一个很好的信息。)


谢谢。

我做了一些挖掘,在实例化新列的过程中,似乎丢失了关于带有别名的
列的子列的信息。也许某处有一个状态需要查询,但我没有找到它

因此,这不是一个答案,但希望它对某些人有用或感兴趣

更多信息

对象上的
as
方法的定义是指
name
函数(请参阅),该函数只调用定义的
别名
case类。
别名
(及其子项
)未公开。它直接提供给
withExpr
函数,该函数基于
别名
命名表达式实例化一个新列

因此,您要么直接比较列上的
toString
的结果(丢失列来自何处的信息,即哪个数据帧),要么实际解析
explain(true)
方法打印的字符串……但对我来说似乎不合理……

我写过如何解决这个问题:

诀窍是:检查
表达式
是否具有
别名
特征:

`column.expr() instanceof Alias`
如果是,请使用提取器模式解压缩子表达式和名称:

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

您能在Scala中完成吗?
alias = (Alias) column.expr()
Option<Tuple2<Expression, String>> aliasTuple = Alias$.MODULE$.unapply(alias);