pyspark - Pyspark:如何根据另一列中的匹配值从数组中的第一次出现中选择直到最后的值
问题描述
我有一个数据框,我需要在其中搜索一个列中存在的值,即另一列中的StringType,即ArrayType,但我想从第一列的第一次出现中选择第二列中的值直到数组中的最后一个值。
下面用例子解释:
输入 DF 如下:
Employee_Name|Employee_ID|Mapped_Project_ID
Name1|E101|[E101, E102, E103]
Name2|E102|[E101, E102, E103]
Name3|E103|[E101, E102, E103, E104, E105]
输出 DF 应如下所示:
Employee_Name|Employee_ID|Mapped_Project_ID
Name1|E101|[E101, E102, E103]
Name2|E102|[E102, E103]
Name3|E103|[E103, E104, E105]
解决方案
从 Spark 2.4 开始,您可以使用array_position
和slice
功能:
import pyspark.sql.functions as f
from pyspark.sql.functions import array_position
from pyspark.sql.functions import slice
df = spark.createDataFrame([(["c", "b", "a","e","f"],'a')], ['arraydata','item'])
df.select(df.arraydata, f.expr("slice(arraydata,array_position(arraydata, item),size(arraydata))").alias("res")).show()
+---------------+---------+
| arraydata| res|
+---------------+---------+
|[c, b, a, e, f]|[a, e, f]|
+---------------+---------+
请把它翻译成你的 df colnames。希望这可以帮助。
推荐阅读
- c# - 使 URL 的参数持久化
- django - 指定 HTTP 或 HTTPS 时 Django 重定向不起作用
- html - 发送带有嵌入图像的数据库邮件
- azure - Azure 存储库中的 Azure 管道和 terraform 模块
- java - 将 MainController 拆分为多个文件时,让 Javafx/Scenebuilder 识别标记的字段和方法?
- printing - 如何从旧机器的热敏打印机中提取数据
- r - 与 magrittr 管道不符的常见功能?
- java - 本机 sql 查询和 JPA 的性能
- bash - 从 bash 脚本运行 find 和 rsync
- wireshark - Wireshark - 从给定的 pcap 文件中查找 HTTP 和应用层有效负载