PySpark-将多行客户“压缩”为一行,删除空白

时间:2018-07-11 11:40:36

标签: pyspark pyspark-sql

所以我目前有一个如下数据框:

+-------------+----------------+---------------+------------------+-----------------+
| customer_id | init_base_date | init_end_date | reinit_base_date | reinit_end_date |
+-------------+----------------+---------------+------------------+-----------------+
| ...         |                |               |                  |                 |
| A           | 2015-07-30     |               |                  |                 |
| A           |                | 2016-07-24    |                  |                 |
| B           | 2015-07-10     |               |                  |                 |
| B           |                | 2015-10-05    |                  |                 |
| B           |                |               | 2016-01-09       |                 |
| B           |                |               |                  | 2016-07-04      |
| C           | 2015-05-13     |               |                  |                 |
| C           |                | 2015-08-09    |                  |                 |
| ...         |                |               |                  |                 |
+-------------+----------------+---------------+------------------+-----------------+

我真的需要将其转换为以下形式:

+-------------+----------------+---------------+------------------+-----------------+
| customer_id | init_base_date | init_end_date | reinit_base_date | reinit_end_date |
+-------------+----------------+---------------+------------------+-----------------+
| ...         |                |               |                  |                 |
| A           | 2015-07-30     | 2016-07-24    |                  |                 |
| B           | 2015-07-10     | 2015-10-05    | 2016-01-09       | 2016-07-04      |
| C           | 2015-05-13     | 2015-08-09    |                  |                 |
| ...         |                |               |                  |                 |
+-------------+----------------+---------------+------------------+-----------------+

我可以想到几种非常乏味的方法来完成上述操作,但是我想知道是否有一种快速有效的方法(也许使用Windows?我现在仅使用PySpark一个月了,所以肯定还是新手)。

1 个答案:

答案 0 :(得分:0)

如果您显示的那些空单元格实际上是null(而不是空字符串),则可以将pyspark.sql.functions.first()用作groupBy中的聚合函数。关键是将ignorenulls的{​​{1}}参数设置为first()(默认为True)。

False

如果这些空白值实际上是空字符串,则可以首先replace all empty strings with null并遵循上述方法。然后,您可以(可选)将import pyspark.sql.functions as f cols = [c for c in df.columns if c != 'customer_id'] df.groupBy('customer_id').agg(*[f.first(c, True).alias(c) for c in cols]).show() #+-----------+--------------+-------------+----------------+---------------+ #|customer_id|init_base_date|init_end_date|reinit_base_date|reinit_end_date| #+-----------+--------------+-------------+----------------+---------------+ #| A| 2015-07-30| 2016-07-24| null| null| #| B| 2015-07-10| 2015-10-05| 2016-01-09| 2016-07-04| #| C| 2015-05-13| 2015-08-09| null| null| #+-----------+--------------+-------------+----------------+---------------+ 值替换为空白。

null