我有一个这样的Dataframe-
-RECORD 0-------------------------------------------
id | 11
order_number | 254
order_date | 2021-03-09
store_id | abc6
employee_code | 6921_abc40
customer_name | harvey
contact_number | 353
address | foo
locality | foo
postal_code | 5600082332
order_info | info
amount | 478.8
payment_type | null
timeA | 2021-03-10 01:34:26
timeB | 2021-03-10 01:35:26
-RECORD 1-------------------------------------------
id | 12
order_number | 2272
order_date | 2021-03-09
store_id | abc666
employee_code | 66_abc55
customer_name | mike
contact_number | 98
address | bar
locality | bar
postal_code | 11000734332
order_info | info
amount_to_be_collected | 0.34
payment_type | null
timeA | 2021-03-10 00:18:04
timeB | 2021-03-10 03:21:06
我想做以下事情-
按雇员代码对记录进行分组,得到一个字典作为回报-
{"emp_code": [Record0, Record1, ....]}
i、 例如,将雇员代码作为键,将该雇员的所有记录列表作为值。
我正在为此写一份工作。我可以通过编程方式通过循环遍历所有记录并获取所需的字典来实现这一点,但这将花费大量时间。我想知道是否有一种方法可以通过使用一些高阶pyspark函数来实现这个结果?
1条答案
按热度按时间hgqdbh6s1#
使用Map
您可以创建一个具有基于
employee_code
一个结构或数组的值为:然后可以使用
selectExpr
作为Map:结构可选:
为此,您需要先对complextypes进行一些转换
grouping by
基本上把结构从某物转变为:变成这样:
可以使用
struct
函数来自from pyspark.sql.functions import struct
:一旦在这种结构中有了它们,就可以执行group by并使用聚合函数collect\u list:
然后可以在结构中选择单个列,如下所示:
甚至可以通过以下方式进行过滤:
如果你想回到原来的样子,看看
explode
函数,该函数接受一列数组并创建一行(其余值为重复值)