我只是在研究一些电火花代码,却不理解这些特殊的代码。我有一个python代码,如下所示:
emp = [("James", "Java", "4"),
("James", "R", "4"),
("James", "Python", "1"),
("Michael", "Java", "2"),
("Michael", "PHP", "4"),
("Michael", "PHP", "2"),
("Robert", "C#", "3"),
("Robert", "Java", "4"),
("Robert", "R", "1"),
("Washington", "Java", "2")
]
empColumns = ["name", "booksInterested", "id"]
empDF = spark.createDataFrame(data=emp, schema=empColumns)
empDF.show()
w = Window.partitionBy('id')
empDF = empDF.withColumn('e_array', F.collect_list('booksInterested').over(w))
empDF.show(truncate=False)
empDF = empDF.agg(F.max('e_array').alias('new_array'))
empDF.show(truncate=False)
当显示empDF之后
empDF = empDF.agg(F.max('e_array').alias('new_array'))
它不是应该显示最长的名单吗?它显示Python,R作为输出?我不明白这个输出是怎么来的?
发布于 2022-05-20 09:10:46
派斯克的max
函数返回
组中表达式的最大值。
在字符串列上使用时(数组列内部转换为字符串),它将根据字母顺序返回最大值:因此,由于e_array
中的所有行都以方括号[
开头,因此该列的最大值将是以字母顺序开头的最大值,在本例中为P
of Python
。
为了检索列中最长的数组,需要使用Pyspark的size
函数,然后根据其值进行筛选:
# calculate size column
empDF = empDF.withColumn('size', F.size('e_array'))
# compute maximum size
max_size = empDF.agg(F.max('size')).collect()[0][0]
print(max_size)
# 4
# show rows with longest arrays
empDF.filter(F.col('size') == max_size).show(truncate=False)
+-------+---------------+---+--------------------+----+
|name |booksInterested|id |e_array |size|
+-------+---------------+---+--------------------+----+
|James |Java |4 |[Java, R, PHP, Java]|4 |
|James |R |4 |[Java, R, PHP, Java]|4 |
|Michael|PHP |4 |[Java, R, PHP, Java]|4 |
|Robert |Java |4 |[Java, R, PHP, Java]|4 |
+-------+---------------+---+--------------------+----+
https://stackoverflow.com/questions/72316218
复制相似问题