【问题标题】:Get the top two elements in a nested list - pyspark获取嵌套列表中的前两个元素 - pyspark
【发布时间】:2018-03-18 18:33:24
【问题描述】:

假设我有一个列表L=[[a,2],[a,3],[a,4],[b,4],[b,8],[b,9]] 使用 pyspark 我希望能够删除第三个元素,使其看起来像这样:

[a,2]
[a,3]
[b,4]
[b,8]

我是 pyspark 的新手,不知道我应该在这里做什么。

【问题讨论】:

标签: python apache-spark pyspark


【解决方案1】:

你可以试试这样的。
第一步是 groupby key 列和列表中的聚合值。然后使用 udf 获取列表的前两个值,然后分解该列。

df = sc.parallelize([('a',2),('a',3),('a',4),
                       ('b',4),('b',8),('b',9)]).toDF(['key', 'value'])
from pyspark.sql.functions import collect_list, udf, explode
from pyspark.sql.types import *

foo = udf(lambda x:x[0:2], ArrayType(IntegerType()))
df_list = (df.groupby('key').agg(collect_list('value')).
                   withColumn('values',foo('collect_list(value)')).
                   withColumn('value', explode('values')).
                   drop('values', 'collect_list(value)'))
df_list.show()

结果

+---+-----+
|key|value|
+---+-----+
|  b|    4|
|  b|    8|
|  a|    2|
|  a|    3|
+---+-----+

【讨论】:

  • 这对我有用。我希望有一个不需要数据框的更清洁的解决方案。也许使用 reduceByKey 和 groupBy 的东西,但似乎没有。谢谢!
  • 我还有一个问题。该解决方案如何与三列一起使用。我正在尝试添加第三列,该列需要与上述解决方案中的“值”相同,但输出未按正确顺序打印。
  • 您能详细说明正确的顺序吗?你的意思是升序还是降序?
  • 我的意思是,当我在您的示例代码中添加另一列时,它不起作用。我在 .agg() 中添加了新值,还使用 ​​withColumn() 创建了新列。当我显示列表时,所有列数据甚至混合在一起,不再显示前五名。
  • 你能编辑问题并用它的模型解决方案添加这个部分吗?
猜你喜欢
  • 2015-10-15
  • 2018-03-21
  • 2023-03-22
  • 2023-02-04
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
相关资源
最近更新 更多