在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_builtin
和 py_buildin.max
用于原生的。以上是关于在pyspark中查找列表的最大值/最小值的主要内容,如果未能解决你的问题,请参考以下文章
从 pyspark 数据框中获取多个(100+)列的空计数、最小值和最大值的最佳方法
如何从从excel文件派生的大量字典中的值列表中查找最小值和最大值