【问题标题】:Unexpected Spark behaviour when joining on union of literal columns加入文字列的联合时出现意外的 Spark 行为
【发布时间】:2018-01-23 06:21:48
【问题描述】:

我使用 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 

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      相关资源
      最近更新 更多