【问题标题】:Pyspark dataframe column to list要列出的 Pyspark 数据框列
【发布时间】:2020-06-12 21:06:58
【问题描述】:

我正在尝试将数据框中的列值列表提取到列表中

+------+----------+------------+
|sno_id|updt_dt   |process_flag|
+------+----------+------------+
| 123  |01-01-2020|     Y      |
+------+----------+------------+
| 234  |01-01-2020|     Y      |
+------+----------+------------+
| 512  |01-01-2020|     Y      |
+------+----------+------------+
| 111  |01-01-2020|     Y      |
+------+----------+------------+

输出应该是 sno_id ['123','234','512','111'] 的列表 然后我需要迭代列表以对列表值上的每个值运行一些逻辑。我目前正在使用 HiveWarehouseSession 通过使用 hive.executeQuery(query) 将数据从 hive 表中提取到 Dataframe 中

感谢您的帮助。

【问题讨论】:

  • 你试图在列表值上运行什么逻辑?您是使用 process_flag 还是 updt_dt 还是两者都分组?

标签: pyspark pyspark-dataframes


【解决方案1】:

这很容易,因为您可以先收集 df,然后返回 Row 类型的列表

row_list = df.select('sno_id').collect()

然后您可以迭代行类型以将列转换为列表

sno_id_array = [ row.sno_id for row in row_list]

sno_id_array 
['123','234','512','111']

使用平面地图和更优化的解决方案

sno_id_array = df.select("sno_id ").rdd.flatMap(lambda x: x).collect()

【讨论】:

  • 我得到了AttributeError: 'list' object has no attribute 'collect',所以用sno_id_array = [ row.sno_id for row in row_list]代替sno_id_array = [ row.sno_id for row in row_list .collect()]
  • 为什么rdd平面图更优?
  • 如果您注意到在第一种方法中我们收集数据帧然后迭代每个值,而在第二种方法中我们不需要这样做,我们直接在 rdd 上进行迭代
  • 当我们谈论数百万个不同的值时,这是一个好方法吗? rdd 一个。
  • @Debuggerrr 一点也不...在pyspark中尽量避免rdd。否则,您将在驱动程序节点上进行大部分计算,这违背了分布式计算的目的。那么你不妨在笔记本电脑上运行。
猜你喜欢
  • 2018-10-05
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
  • 2020-03-11
相关资源
最近更新 更多