过滤但保留空行

时间:2018-06-12 17:44:37

标签: dataframe pyspark apache-spark-sql

我有一个融合的数据框,如下所示:

# +---+--------+----------+
# | id|  c_type|c_type_val|
# +---+--------+----------+
# |  1|c_type_1|      null|
# |  1|c_type_2|      null|
# |  1|c_type_3|         r|
# |  2|c_type_1|         a|
# |  2|c_type_2|      null|
# |  2|c_type_3|      null|
# |  3|c_type_1|      null|
# |  3|c_type_2|      null|
# |  3|c_type_3|      null|
# +---+--------+----------+

我想将行缩减为只有具有值的行或者没有值的行我希望将它们设置为null类型和null值,如下所示:

# +---+--------+----------+
# | id|  c_type|c_type_val|
# +---+--------+----------+
# |  1|c_type_3|         r|
# |  2|c_type_1|         a|
# |  3|    null|      null|
# +---+--------+----------+

最初我是这样过滤的,但它会丢弃id = 3的整行:

df.filter(df.c_type_val.isNotNull()).show()

1 个答案:

答案 0 :(得分:1)

从原始数据框中选择id列,删除重复项,然后您可以将其与过滤结果一起使用,其中缺少的ID将包含其他列的空值。

df.select('id').dropDuplicates().join(
    df.filter(df.c_type_val.isNotNull()), ['id'], how='left'
).show()

+---+--------+----------+
| id|  c_type|c_type_val|
+---+--------+----------+
|  1|c_type_3|         r|
|  3|    null|      null|
|  2|c_type_1|         a|
+---+--------+----------+