如何遍历Pyspark DataFrame的列并逐列应用操作

时间:2017-06-07 19:20:51

标签: python apache-spark dataframe pyspark

我有一个Pyspark Dataframe,当我运行这段代码时

queries_df.select(*(queries_df[i] for i in range(5))).show(5)

我得到以下答案(这是我的预期):

+----------+----------------+--------+-------+-------------+
|query_time|210 mini netbook|47lv5500|antenna|apple macbook|
+----------+----------------+--------+-------+-------------+
|2011-08-11|               1|       1|     10|            5|
|2011-08-12|               1|       0|      0|           10|
|2011-08-15|               0|       0|      3|            0|
|2011-08-17|               0|       0|      0|            0|
|2011-08-18|               5|       0|      0|            0|
+----------+----------------+--------+-------+-------------+

我需要循环遍历每一列,并在每个单独的列中按元素应用减法元素。类似于numpy.diff()函数。

问题在于我无法弄清楚如何获得每一行。

当我这样做时:

diff_arrays = queries_df.select(*(queries_df[i] for i in range(1,5)))
.rdd.map(lambda a: a)

diff_arrays.collect()

我得到一个Rows对象列表:

[Row(210 mini netbook=1, 47lv5500=1, antenna=10, apple macbook=5),
 Row(210 mini netbook=1, 47lv5500=0, antenna=0, apple macbook=10),
 Row(210 mini netbook=0, 47lv5500=0, antenna=0, apple macbook=0),
 Row(210 mini netbook=0, 47lv5500=0, antenna=0, apple macbook=0), ... ]

但是当我尝试应用reduce操作时,我收到错误AttributeError: 'NoneType' object has no attribute 'reduce'

这就是我的尝试:

diff_arrays.foreach(lambda column: column).reduce(some_function)

有没有人知道如何实现这一目标?谢谢!

修改

为了更清楚,我将更改示例表并提供预期的输出。

当我运行适当的代码来应用差异时,我想得到如下答案:

+------------------+-----+-----+----+---+
| 210 mini netbook |   0 |  -1 |  0 | 5 |
| 47lv5500         |  -1 |   0 |  0 | 0 |
| antenna          | -10 |   3 | -3 | 0 |
| apple macbook    |   5 | -10 |  0 | 0 |
+------------------+-----+-----+----+---+

0 个答案:

没有答案