2016-09-29 2 views
3

Я пытаюсь написать несколько тестов для приложения Java Spark-Sql. Одна операция, которую мне нужно проверить, переименовывает столбец, и я столкнулся с некоторыми трудностями, сравнивая фактическое значение переименованного столбца с моим ожидаемым значением. После некоторых экспериментов я смог написать следующие два теста, чтобы продемонстрировать проблему:Как проверить равенство столбцов искры после переименования

Во-первых, как проверка работоспособности, я попробовал это (df - это искра 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), похоже, что это связано с NamedExpression уникальным идентификатором ,

Есть ли способ разумно проверить, что эти два столбца представляют одни и те же операции с одним и тем же псевдонимом?

(я работаю в искре 1.6, и, в идеале, как решение для этой версии строки, но если это зафиксировано в 2.0, что также будет хорошей информацией.)

Спасибо вам.

ответ

2

Я написал a blog post о том, как решить эту проблему:

Уловка: проверить, имеет ли Expression на Alias черта:

`column.expr() instanceof Alias` 

Если это произойдет, распаковывать выражение ребенка и имя с помощью Экстрактор:

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

Можете ли вы сделать это в Скала? – Wilmerton

0

Я сделал некоторые копания, и похоже, что информация о ребенке Column с псевдонимом теряется в процессе создания нового столбца. Может быть, есть какое-то состояние для запроса, но я этого не нашел.

Так что это не ответ, но, надеюсь, это полезно или интересно кому-то.

подробнее

Определение as метода на Column объект относится к функции name (см Column.scala), который просто вызвать класс Alias случай, определенный here. Alias (с его child), не выставлен. Он непосредственно передается функции Column класса withExpr, которая создает экземпляр нового столбца на основе названного выражения Alias.

Таким образом, вы либо непосредственно сравнивать результат toString на колоннах (расторгнув информацию о том, где столбец происходит от, т.е. который dataframe), или вы на самом деле разобрать строку распечатанный методом explain(true) ... но мне кажется неразумным ...

Смежные вопросы