我已经使用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
有人可以解释这种行为吗?我做错了吗?
答案 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']))