2016-09-29 13 views
3

Java Spark-SQLアプリケーションのテストをいくつか作成しようとしています。テストする必要がある操作の1つに列の名前が変更されました。名前が変更された列の実際の値と期待値を比較するのが難しくなりました。いくつかの実験の後に、私は問題を実証するために以下の2つのテストを書くことができました:名前を変更した後にスパーク列の一致をチェックする方法

まず最初に、私はこれを試しました(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); 
    } 

Scalaのコードで周り掘りエラーjava.lang.AssertionError: expected:<col2 AS col2#4L> but was:<col2 AS col2#5L>

で失敗した(完全な情報開示 - 私は非常に少ないScalaのを知っている)、これはNamedExpression一意のIDに関係しているように見えます。

これらの2つの列が同じエイリアスで同じ操作を表すかどうかを確認する方法はありますか?

(私は火花1.6で働いている、となり、理想的にそのバージョンの行のためのソリューションのように、これは2.0に固定されている場合にも良い情報になるという。)

ありがとうございます。

答えて

2

私はこれを解決する方法についてa blog postを書いた:

をトリックがある:それは、使用して、子発現と名前を解凍しない場合

`column.expr() instanceof Alias` 

ExpressionAlias形質を持っているかどうかを確認しますエクストラクタのパターン:

​​
+0

Scalaで実行できますか? – Wilmerton

0

私はいくつかの掘り出しを行い、新しい列をインスタンス化する過程でエイリアスを持つColumnの子に関する情報が失われているようです。たぶんどこかに照会する状態がありますが、私はそれを見つけられませんでした。

これは答えではありませんが、うまくいけば誰かにとって有益なことです。

詳細Columnオブジェクトにas方法の

定義だけhere定義Aliasケースクラスを呼び出すname機能(Column.scalaを参照のこと)を指します。 Alias(そのchild)は公開されていません。 Aliasという名前の式に基づいて新しい列をインスタンス化する関数ColumnクラスwithExprに直接与えられます。

ですから、直接カラム(列がどこから来るかについての情報を失うこと、すなわちデータフレーム)にtoStringの結果を比較するのいずれか、またはあなたが実際にexplain(true)方法でを印刷した文字列を解析する...しかし、それ私にとっては賢明ではないようです...

関連する問題