2017-08-15 15 views
0

私はSpark(現行バージョン2.1.0)をしばらく使っていましたが、いくつかの奇妙な動作に遭遇しました。リテラルカラムの結合で予期しないスパークの振る舞い

df_before = sparkSession.createDataFrame([('a', 4), ('b', 5)], ['A', 'B']) 
df_after = sparkSession.createDataFrame([('a', 6), ('b', 7)], ['A', 'B']) 

我々は彼らの起源(か何か)を記述する欄でそれらを強化:

のは、次の2つのデータフレームがあるとしましょう。この場合、前または後に言うだけで、カラム:

df_before = df_before.withColumn('C', lit('before')) 
df_after = df_after.withColumn('C', lit('after')) 

そして、もう一つのデータフレームにそれらを一緒に置く:

df_all = df_before.union(df_after) 

私たちに与える:

A | B | C 
---|---|------ 
a | 4 | before 
b | 5 | before 
a | 6 | after 
b | 7 | after 

次へ]を、我々はまたに起こります異なるデータフレームを持つ:

data_other = [ 
    ('a', 'before', 10), 
    ('b', 'before', 11), 
    ('a', 'after', 12), 
    ('b', 'after', 13) 
] 

df_other = sparkSession.createDataFrame(data_other, ['A', 'C', 'D']) 

私は、2つのstraighforwardly参加する場合:

df_all.join(df_other, ['A', 'C']) 

は私が取得:

A | C  | B | D 
---|--------|---|---- 
a | before | 4 | 10 
b | before | 5 | 11 
a | after | 6 | 12 
b | after | 7 | 13 

誰かがこの動作を説明することができます:私が期待したものと異なっている

A | C  | B | D 
---|--------|---|---- 
a | before | 4 | 10 
b | before | 5 | 11 
a | after | 6 | 10 
b | after | 7 | 11 

?私は何か間違っているのですか?

答えて

0

一般的な解決策: スパークを2.1.1にアップグレードすると、バグ修正SPARK-19766が解決されます。

オプションが利用できないことを何らかの理由で、これは2.1.0の回避策の場合:

の代わりに:

df_after = df_after.withColumn('C', lit('after')) 

列を作成するために、UDFを使用します。

def my_lit(literal): 
    def returnLiteral(x): return literal 
    return udf(returnLiteral, StringType()) 

df_after.withColumn('C', my_lit('after')(df_after['A'])) 
関連する問題