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