我面临的一个问题是获取一个数组,其中所有条目位于两个专用条目之间。 我有一张桌子,大致如下:
| Type | State | Domain | Time |
|------|-------------|--------|----------|
| A | eating | Fruit | 12:33:11 |
| A | working | day | 12:35:12 |
| A | working | day | 12:44:55 |
| A | sleep | day | 12:59:53 |
| A | enjoying | Fruit | 08:12:04 |
| A | thinking | day | 09:16:32 |
| A | eating | Fruit | 10:44:31 |
| A | daydreaming | day | 10:44:33 |
| A | calling | day | 10:59:01 |
| B | wondering | Fruit | 10:00:01 |
| B | digesting | day | 10:49:09 |
| B | cleaning | day | 12:00:27 |
| B | eating | Fruit | 04:03:22 |
我想得到如下输出:
| Type | State | Domain | Time | Intermediate Output | Array Count | Mode Array |
|------|-------------|------------|----------|---------------------------------|-------------|----------------------------|
| A | eating | Fruit | 12:33:11 | ['working', 'working', 'sleep'] | 3 | working |
| A | working | day | 12:35:12 | None | 0 | None |
| A | working | day | 12:44:55 | None | 0 | None |
| A | sleep | day | 12:59:53 | None | 0 | None |
| A | enjoying | Fruit | 08:12:04 | ['day'] | 1 | day |
| A | thinking | day | 09:16:32 | None | 0 | None |
| A | eating | Fruit | 10:44:31 | ['daydreaming', 'calling'] | 2 | ['daydreaming', 'calling'] |
| A | daydreaming | day | 10:44:33 | None | 0 | None |
| A | calling | day | 10:59:01 | None | 0 | None |
| B | wondering | Fruit | 10:00:01 | ['digesting','cleaning'] | 2 | ['digesting','cleaning'] |
| B | digesting | day | 10:49:09 | None | 0 | None |
| B | cleaning | day | 12:00:27 | None | 0 | None |
| B | eating | Fruit | 04:03:22 | [] | 0 | [] |
基本上通过类型和域进行分区,以获得两个不同域值之间的差异。域列中的值只能取两个值[水果,天]。 我基本上想要获得数组中的所有状态名,从第一次域是Fruit直到下一个Fruit条目出现。另外两列应基于此数组中间输出,以获取数组的长度及其模式。 一个类型中可以出现任意多个水果条目。 整个数据集根据时间列按时间顺序排列
不幸的是,基础设施只允许pyspark,所以我不能使用pandas
我真的很感激任何帮助和提示,因为我是一个Pypark Noob! 提前非常感谢
我用两个窗口函数来解决这个问题。(同时,假设您的记录将按“时间”列排序)
由于您的“域”只能接受两个值,因此我将“水果”编码为1,“天”编码为0。我们将在这个新的域列上执行
incremental sum
,将其用作组“State”的键从
collect_list
函数的输出中删除第一个元素并保留其余元素。我正在使用remove_first_element UDF
来实现这一点当“域”为“天”时,您不需要“数组_输出”。因此,每当'Domain'是'day'时,就用
None
替换它F.size()
获取数组大小,自定义UDFget_multi_mode_list_udf
获取多模式值构建数据帧:
实际操作:
查找模式:
输出:
相关问题 更多 >
编程相关推荐