数据框加入左行为[重复]

Posted

技术标签:

【中文标题】数据框加入左行为[重复]【英文标题】:Dataframe Join Left Behavior [duplicate] 【发布时间】:2018-06-13 16:57:33 【问题描述】:

我需要将两个数据框连接在一起以添加存在的列数据,但它的行为与我预期的不同。

dfA:

# +---+-----+-----+
# | id|d_var|d_val|
# +---+-----+-----+
# |a01|  112| null|
# |a01|  113|    0|
# |a02|  112| null|
# |a02|  113|    0|
# +---+-----+-----+

dfB:

# +---+-----+-----+------+-----+
# | id|d_var|d_val|c_type|c_val|
# +---+-----+-----+------+-----+
# |a01|  112| null|   red|    1|
# |a01|  113|    0|   red|    1|
# +---+-----+-----+------+-----+

以下是行为异常的数据框创建和加入调用:

dfA = spark.createDataFrame(
    [
        ('a01', '112', None),
        ('a01', '113', '0'),
        ('a02', '112', None),
        ('a02', '113', '0')
    ],
    ('id', 'd_var', 'd_val')
)

dfB = spark.createDataFrame(
    [
        ('a01', '112', None, 'red', '1'),
        ('a01', '113', '0', 'red', '1')
    ],
    ('id', 'd_var', 'd_val', 'c_type', 'c_val')
)

static_cols = dfB.columns[:3]
dfA.join(dfB, static_cols, how='left').orderBy('id', 'd_var').show()

输出:

# +---+-----+-----+------+-----+
# | id|d_var|d_val|c_type|c_val|
# +---+-----+-----+------+-----+
# |a01|  112| null|  null| null|  <-
# |a01|  113|    0|   red|    1|
# |a02|  112| null|  null| null|
# |a02|  113|    0|  null| null|
# +---+-----+-----+------+-----+

预期(和期望)输出:

# +---+-----+-----+------+-----+
# | id|d_var|d_val|c_type|c_val|
# +---+-----+-----+------+-----+
# |a01|  112| null|   red|    1|  <-
# |a01|  113|    0|   red|    1|
# |a02|  112| null|  null| null|
# |a02|  113|    0|  null| null|
# +---+-----+-----+------+-----+

【问题讨论】:

2.3.0(堆栈溢出需要更多字符在这里留下评论) 看起来火花正确等同于连接上的null 列的问题。既然您在2.3.0 上,请查看this answer 关于Column.eqNullSafe 中的PySpark 就是@TravisHegner,谢谢。正确,我已将其标记为重复。 【参考方案1】:

(如果这与@Shaido 的添加一起保留,请发布我的答案)

cond = (dfA.id.eqNullSafe(dfB.id) & dfA.d_var.eqNullSafe(dfB.d_var) & dfA.d_val.eqNullSafe(dfB.d_val))
dfA.join(dfB, cond, how='left').select(dfA.id, dfA.d_var, dfA.d_val, dfB.c_type, dfB.c_val).orderBy('id', 'd_var').show()

【讨论】:

以上是关于数据框加入左行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章

加入两个数据框表[重复]

加入两个具有重复值的熊猫数据框[重复]

加入两个数据框以获得笛卡尔积[重复]

加入后如何删除具有非空值的重复列? [复制]

Pyspark 加入数据框

Spark基于其他数据框中的列对数据框中的列进行重复数据删除