我有一个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 |
+------------------+-----+-----+----+---+