加入文字列的并集时出现意外的Spark行为

时间:2017-08-15 10:24:02

标签: python apache-spark join pyspark spark-dataframe

我已经使用Spark(当前版本2.1.0)一段时间了,但遇到了一些奇怪的行为。

假设您有两个数据框:

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

我们用一个描述其起源(或某事)的列来扩充它们。在这种情况下,只是一个在之前或之后说的列:

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'])

如果我然后直接加入两个人:

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

我明白了:

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

这与我的预期不同:

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

有人可以解释这种行为吗?我做错了吗?

1 个答案:

答案 0 :(得分:0)

一般解决方案: 将Spark升级到2.1.1,因为bugfix 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']))