【问题标题】:Fidning max/min value of a list in pyspark在pyspark中查找列表的最大值/最小值
【发布时间】:2026-02-21 05:30:01
【问题描述】:

我知道这是一个非常微不足道的问题,我很惊讶我在互联网上找不到答案,但是可以在 pyspark 中找到列表的最大值或最小值吗? 在 Python 中,它很容易通过

max(list)

但是,当我在 pyspark 中尝试相同操作时,我收到以下错误:

An error was encountered:
An error occurred while calling z:org.apache.spark.sql.functions.max. Trace:
py4j.Py4JException: Method max([class java.util.ArrayList]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:339)
    at py4j.Gateway.invoke(Gateway.java:276)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)

关于我做错了什么有什么想法吗?

更新:添加我所做的: 这是我的清单:

cur_datelist

输出:

['2020-06-10', '2020-06-11', '2020-06-12', '2020-06-13', '2020-06-14', '2020-06-15', '2020-06-16', '2020-06-17', '2020-06-18', '2020-06-19', '2020-06-20', '2020-06-21', '2020-06-22', '2020-06-23', '2020-06-24', '2020-06-25', '2020-06-26', '2020-06-27', '2020-06-28', '2020-06-29', '2020-06-30', '2020-07-01', '2020-07-02', '2020-07-03', '2020-07-04', '2020-07-05', '2020-07-06', '2020-07-07', '2020-07-08', '2020-07-09', '2020-07-10', '2020-07-11', '2020-07-12', '2020-07-13', '2020-07-14', '2020-07-15', '2020-07-16', '2020-07-17', '2020-07-18', '2020-07-19', '2020-07-20', '2020-07-21', '2020-07-22', '2020-07-23', '2020-07-24', '2020-07-25', '2020-07-26', '2020-07-27', '2020-07-28', '2020-07-29', '2020-07-30', '2020-07-31', '2020-08-01', '2020-08-02', '2020-08-03', '2020-08-04', '2020-08-05', '2020-08-06', '2020-08-07', '2020-08-08', '2020-08-09', '2020-08-10', '2020-08-11', '2020-08-12', '2020-08-13', '2020-08-14', '2020-08-15', '2020-08-16', '2020-08-17', '2020-08-18', '2020-08-19', '2020-08-20', '2020-08-21', '2020-08-22', '2020-08-23', '2020-08-24', '2020-08-25', '2020-08-26', '2020-08-27', '2020-08-28', '2020-08-29', '2020-08-30', '2020-08-31']

类是“列表”: type(cur_datelist)

我认为这是一个普通的 Pythonic 列表。 所以当我尝试max(cur_datelist) 时,我得到了上面提到的错误。

【问题讨论】:

  • 你不只是打电话给org.apache.spark.sql.functions.max([1,2,3,4])max 是一个将列作为参数的数据框函数。如果你有一个 Python 列表,就像你做的那样调用内置函数。

标签: amazon-web-services pyspark apache-spark-sql


【解决方案1】:

pyspark 和 python 的列表没有区别,但列是不同的。这是我的 pyspark 的结果。

# just a list
l = [1, 2, 3]
print(max(l))

# 3

# dataframe with the array column
df = spark.createDataFrame([(1, [1, 2, 3]), (2, [4, 5, 6])]).toDF('id', 'list')

import pyspark.sql.functions as f

df.withColumn('max', f.array_max(f.col('list'))).show()

#+---+---------+---+
#| id|     list|max|
#+---+---------+---+
#|  1|[1, 2, 3]|  3|
#|  2|[4, 5, 6]|  6|
#+---+---------+---+

您的错误来自python本机和spark列函数之间的max函数重叠!为避免这种情况,请指定您的 pyspark 函数。那么max表示python原版。

import pyspark.sql.functions as f

l = ['2020-06-10', '2020-06-11', '2020-06-12', '2020-06-13', '2020-06-14', '2020-06-15', '2020-06-16', '2020-06-17', '2020-06-18', '2020-06-19', '2020-06-20', '2020-06-21', '2020-06-22', '2020-06-23', '2020-06-24', '2020-06-25', '2020-06-26', '2020-06-27', '2020-06-28', '2020-06-29', '2020-06-30', '2020-07-01', '2020-07-02', '2020-07-03', '2020-07-04', '2020-07-05', '2020-07-06', '2020-07-07', '2020-07-08', '2020-07-09', '2020-07-10', '2020-07-11', '2020-07-12', '2020-07-13', '2020-07-14', '2020-07-15', '2020-07-16', '2020-07-17', '2020-07-18', '2020-07-19', '2020-07-20', '2020-07-21', '2020-07-22', '2020-07-23', '2020-07-24', '2020-07-25', '2020-07-26', '2020-07-27', '2020-07-28', '2020-07-29', '2020-07-30', '2020-07-31', '2020-08-01', '2020-08-02', '2020-08-03', '2020-08-04', '2020-08-05', '2020-08-06', '2020-08-07', '2020-08-08', '2020-08-09', '2020-08-10', '2020-08-11', '2020-08-12', '2020-08-13', '2020-08-14', '2020-08-15', '2020-08-16', '2020-08-17', '2020-08-18', '2020-08-19', '2020-08-20', '2020-08-21', '2020-08-22', '2020-08-23', '2020-08-24', '2020-08-25', '2020-08-26', '2020-08-27', '2020-08-28', '2020-08-29', '2020-08-30', '2020-08-31']
print(max(l))

# 2020-08-31

或者,

import builtins as p

print(p.max(l))
# 2020-08-31

【讨论】:

  • 但是我的列表不在数据框中,它只是一个简单的类 list 列表使用 f.array_max(list) 不起作用。为了使用 array_max 函数,我是否必须强制它进入数据框?
  • 我不明白你的意思。你的列表不是数据框,那么它是一个正常的列表,对吗?在我的回答中,max(l) 会起作用。
  • 我已经更新了我的问题并添加了确切的列表和我尝试过的内容。这不是一个真正的 Pythonic 列表吗?
  • 最后,找出问题所在。您的最大功能重叠。
  • 你可以用另一种方式,import builtins as py_builtinpy_buildin.max 用于原生的。