在pyspark中查找列表的最大值/最小值

Posted

技术标签:

【中文标题】在pyspark中查找列表的最大值/最小值【英文标题】:Fidning max/min value of a list in pyspark 【发布时间】:2020-08-29 18:00:49 【问题描述】:

我知道这是一个非常微不足道的问题,我很惊讶我在互联网上找不到答案,但是可以在 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 列表,就像你做的那样调用内置函数。 【参考方案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 用于原生的。

以上是关于在pyspark中查找列表的最大值/最小值的主要内容,如果未能解决你的问题,请参考以下文章

从 pyspark 数据框中获取多个(100+)列的空计数、最小值和最大值的最佳方法

Pyspark - 从具有最小值和最大值范围的数组中获取值

如何从从excel文件派生的大量字典中的值列表中查找最小值和最大值

在python中跨多个列表查找列的最小值

使用java编写两个方法min和max在链表中查找最大值和最小值,但输入列表是整数数组

PySpark:在汇总负数分布时,describe() 函数出错——最小值和最大值翻转