将 spark DataFrame 列转换为 python 列表

新手上路,请多包涵

我处理具有两列 mvv 和 count 的数据框。

 +---+-----+
|mvv|count|
+---+-----+
| 1 |  5  |
| 2 |  9  |
| 3 |  3  |
| 4 |  1  |

我想获得两个包含 mvv 值和计数值的列表。就像是

mvv = [1,2,3,4]
count = [5,9,3,1]

所以,我尝试了以下代码: 第一行应该返回一个 python 行列表。我想看到第一个值:

 mvv_list = mvv_count_df.select('mvv').collect()
firstvalue = mvv_list[0].getInt(0)

但我收到第二行的错误消息:

属性错误:getInt

原文由 a.moussa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 576
2 个回答

看,为什么你正在做的这种方式不起作用。首先,您尝试从 类型中获取整数,您收集的输出如下所示:

 >>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)

如果你采取这样的做法:

 >>> firstvalue = mvv_list[0].mvv
Out: 1

您将获得 mvv 值。如果你想要数组的所有信息,你可以采取如下方式:

 >>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]

但是,如果您对另一列尝试相同的操作,您会得到:

 >>> mvv_count = [int(row.count) for row in mvv_list.collect()]
Out: TypeError: int() argument must be a string or a number, not 'builtin_function_or_method'

发生这种情况是因为 count 是一种内置方法。并且该列与 count 具有相同的名称。解决方法是将 count 的列名更改为 _count

 >>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]

但是不需要这种解决方法,因为您可以使用字典语法访问该列:

 >>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]

它最终会奏效!

原文由 Thiago Baldim 发布,翻译遵循 CC BY-SA 4.0 许可协议

跟随一个班轮给出你想要的列表。

 mvv = mvv_count_df.select("mvv").rdd.flatMap(lambda x: x).collect()

原文由 Neo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题