gpt4 book ai didi

java - 重命名后如何检查 Spark 列的相等性

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:44 25 4
gpt4 key购买 nike

我正在尝试为 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 有关唯一标识。

有什么方法可以明智地检查这两列是否代表具有相同别名的相同操作?

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

谢谢。

最佳答案

我写了a blog post关于如何解决这个问题:

诀窍是:检查 Expression 是否具有 Alias 特征:

`column.expr() instanceof Alias`

如果是,使用提取器模式解压子表达式和名称:

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

关于java - 重命名后如何检查 Spark 列的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39779061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com