我有以下Apache Spark数据帧(DF1):
function_name | param1 | param2 | param3 | result
---------------------------------------------------
f1 | a | b | c | 1
f1 | b | d | m | 0
f2 | a | b | c | 0
f2 | b | d | m | 0
f3 | a | b | c | 1
f3 | b | d | m | 1
f4 | a | b | c | 0
f4 | b | d | m | 0
首先,我想按function_name
对DataFrame进行分组,将结果收集到ArrayType
中并接收新的DataFrame(DF2):
function_name | result_list
--------------------------------
f1 | [1,0]
f2 | [0,0]
f3 | [1,1]
f4 | [0,0]
之后,我需要收集function_name
到ArrayType
通过分组result_list
,我将收到如下所示的新DataFrame(DF3):
result_list | function_name_lists
------------------------------------
[1,0] | [f1]
[0,0] | [f2,f4]
[1,1] | [f3]
所以,我有一个问题 - 首先,我可以在阿帕奇火花中使用按数组类型列分组吗?如果是这样,我可能会在 ArrayType
单个字段中result_list数千万个值。在这种情况下,阿帕奇火花是否能够按result_list
列进行分组?
是的,你能做到。
from pyspark.sql.window import Window
from pyspark.sql import functions as F
from pyspark.sql.types import *
list=[['f1','a','b','c',1],
['f1','b','d','m',0],
['f2','a','b','c',0],
['f2','b','d','m',0],
['f3','a','b','c',1],
['f3','b','d','m',1],
['f4','a','b','c',0],
['f4','b','d','m',0]]
df= spark.createDataFrame(list,['function_name','param1','param2','param3','result'])
df.show()
+-------------+------+------+------+------+
|function_name|param1|param2|param3|result|
+-------------+------+------+------+------+
| f1| a| b| c| 1|
| f1| b| d| m| 0|
| f2| a| b| c| 0|
| f2| b| d| m| 0|
| f3| a| b| c| 1|
| f3| b| d| m| 1|
| f4| a| b| c| 0|
| f4| b| d| m| 0|
+-------------+------+------+------+------+
w=Window().partitionBy("function_name").orderBy(F.col("param1"),F.col("param2"),F.col("param3"))
w1=Window().partitionBy("function_name")
df1=df.withColumn("result_list", F.collect_list("result").over(w)).withColumn("result2",F.row_number().over(w))\
.withColumn("result3",F.max("result2").over(w1))\
.filter(F.col("result2")==F.col("result3")).drop("param1","param2","param3","result","result2","result3")
df1.groupBy("result_list")\
.agg(F.collect_list("function_name").alias("function_name_list")).show()
+-----------+------------------+
|result_list|function_name_list|
+-----------+------------------+
| [1, 0]| [f1]|
| [1, 1]| [f3]|
| [0, 0]| [f2, f4]|
+-----------+------------------+
为了对数组类型列进行进一步的分析、转换或清理,我建议您查看斯派克2.4及更高版本中的新高阶函数。
(collect_list适用于spark1.6及以上版本)
开源中的高阶函数:
https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.collect_list
https://spark . Apache . org/docs/latest/API/python/py spark . SQL . html # py spark . SQL . functions . array _ contains起
Databricks发布:链接:https://docs.databricks.com/delta/data-transformation/higher-order-lambda-functions.html
问题内容: 假设我有一个这样的列表: 我如何最优雅地将其分组以在Python中获得此列表输出: 因此,这些值按次值分组,但顺序保留下来。 问题答案:
我有一个包含多列的数据框架: 我现在想将组合成一列。但是,我不知道列列表会有多大,否则我可以使用UDF3来组合这三个。 所以期望的结果是: 我怎样才能实现这一点? 不工作的伪代码: 最坏的解决方法是对输入列的数量执行switch语句,然后为每个输入列编写一个UDF,即2-20个输入列,如果提供了更多的输入列,则抛出一个错误。
问题内容: 给定这样的假设查询: 并有一个类似于下面的表格: 所需结果: 有什么方法可以使用GROUP BY和LIKE语句(LIKE“ silver”,LIKE“ gold”,LIKE“ platinum”等)对这些条目进行分组? 问题答案: 您可以使用: 某些数据库允许您在中使用列别名。
我肯定这是一个愚蠢的问题,但我找不到一个简单的方法将一个列表按另一个列表分组。我在网上搜索了很多,但我只找到了带有类属性或排序元素的示例。 我有一个带有键的字符串列表,例如: 和一个我想按键列表分组的int列表,例如: 因此结果应该是一个包含子列表的列表,如下所示: 或者也可以得到指数。提前道谢。
我有一个String变量,其中包含几个用逗号分隔的列名。例如: val temp = "第二列,第三列,第四列" 我有一个Dataframe,我想根据某些列对Dataframe进行分组,其中包括存储在temp变量中的列。例如,我的groupBy语句应该像下面的语句 DF.groupBy(“Col1”、“Col2”、“Col3”、“Col4”) temp变量可以有任何列名。因此,我想创建一个Grou
我需要使用特定对象的属性(