WHERE arrays_overlap(, array())
然而,当尝试将这种逻辑直接转换为PySpark时,许多用户会遇到困难。一个常见的错误尝试是:
from pyspark.sql.functions import col, array, arrays_overlap# 假设 target_list 是一个 Python 列表,如 ['apple', 'banana']df.filter(arrays_overlap(col("array_column"), array(target_list)))
这段代码通常会导致AnalysisException,错误信息类似于[UNRESOLVED_COLUMN.WITH_SUGGESTION] A column or function parameter with name ” cannot be resolved.。这是因为array()函数在接收非列参数时,期望的是字面量表达式(literal expressions),而不是原始的Python列表元素。虽然array_contai ns函数可以处理单个元素,但它无法满足与整个列表进行交集判断的需求。
2. 解决方案:结合 lit 函数
解决这个问题的关键在于,将Python列表中的每个元素转换为Spark的字面量表达式(literal expression),然后再用array函数将其组合成一个字面量数组。这可以通过pyspark.sql.functions.lit函数来实现。
lit函数的作用是将一个Python值转换为一个Spark列表达式,这个表达式代表着一个常量值。当我们将列表中的每个元素都通过lit转换后,再将这些字面量表达式传递给array函数,array函数就能正确地构建一个包含这些字面量值的数组。
正确的PySpark实现如下:
from pyspark.sql import SparkSessionfrom pyspark.sql.functions import col, array, arrays_overlap, lit# 1. 初始化 SparkSessionspark = SparkSession.builder.appName("ArrayColumnFilter").getOrCreate()# 2. 准备示例数据data = [ (1, ["apple", "banana", "orange"]), (2, ["grape", "kiwi"]), (3, ["banana", "strawberry"]), (4, ["mango", "pineapple"]), (5, ["apple", "grape"])]df = spark.createDataFrame(data, ["id", "fruits_array"])df.printSchema()df.show()# 3. 定义用于过滤的 Python 列表target_list = ["banana", "grape", "lemon"]# 4. 构建正确的过滤条件# 使用 map(lit, target_list) 将列表中的每个元素转换为 lit 表达式# 使用 * 解包这些 lit 表达式作为 array 函数的参数# 最后,使用 arrays_overlap 进行比较filtered_df = df.filter( arrays_overlap(col("fruits_array"), array(*map(lit, target_list))))# 5. 显示过滤结果print(f"n原始DataFrame:")df.show()print(f"n过滤列表:{target_list}")print("n过滤后的DataFrame(fruits_array与target_list有交集):")filtered_df.show()# 6. 停止 SparkSessionspark.stop()
运行结果示例:
root |-- id: long (nullable = true) |-- fruits_array: array (nullable = true) | |-- element: string (nullable = true)+---+--------------------+| id| fruits_array|+---+--------------------+| 1|[apple, banana, o...|| 2| [grape, kiwi]|| 3|[banana, strawber...|| 4|[mango, pineapple]|| 5| [apple, grape]|+---+--------------------+原始DataFrame:+---+--------------------+| id| fruits_array|+---+--------------------+| 1|[apple, banana, o...|| 2| [grape, kiwi]|| 3|[banana, strawber...|| 4|[mango, pineapple]|| 5| [apple, grape]|+---+--------------------+过滤列表:['banana', 'grape', 'lemon']过滤后的DataFrame(fruits_array与target_list有交集):+---+--------------------+| id| fruits_array|+---+--------------------+| 1|[apple, banana, o...|| 2| [grape, kiwi]|| 3|[banana, strawber...|| 5| [apple, grape]|+---+--------------------+
从结果可以看出,id为1、2、3、5的行被保留,因为它们的fruits_array列与[“banana”, “grape”, “lemon”]存在交集(例如,id=1包含”banana”,id=2包含”grape”,id=3包含”banana”,id=5包含”grape”)。
3. 关键概念与注意事项
arrays_overlap(array1, array2) : 这个函数用于判断两个数组是否有共同的元素。如果存在任何共同元素,则返回True;否则返回False。它是进行数组交集判断的核心。lit(value) : lit函数将一个Python字面量(如字符串、数字、布尔值)转换为一个Spark SQL的字面量列。这是在PySpark中构建常量值表达式的常用方法。*`array( expressions)**:array`函数有两种主要用法:当参数是列名时,它将这些列的值组合成一个新的数组列。例如:array(col(“col1”), col(“col2”))。当参数是字面量表达式时,它会创建一个包含这些字面量值的字面量数组。例如:array(lit(“a”), lit(“b”))。我们这里的解决方案属于第二种情况,map(lit, target_list)生成了一系列字面量表达式,*操作符将它们解包作为array函数的独立参数。错误避免 : 理解array函数对参数类型的期望是避免AnalysisException的关键。直接传递Python列表array(target_list)会被Spark误解为target_list中的第一个元素是一个列名,因此无法解析。
4. 总结
在PySpark中,当需要使用一个Python列表与DataFrame的数组列进行交集过滤时,务必记住使用pyspark.sql.functions.lit函数将列表中的每个元素转换为Spark字面量表达式。然后,通过array(*map(lit, your_list))的方式构建一个字面量数组,并将其作为arrays_overlap函数的第二个参数。这种模式是处理这类复杂数组过滤逻辑的标准且正确的方法,能够确保代码的健壮性和准确性。
以上就是在PySpark中利用数组列与列表交集进行DataFrame过滤的正确姿势的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373239.html
赞 (0)
打赏
微信扫一扫
支付宝扫一扫
相关推荐
本教程将指导如何在python tkinter应用中实现一个灵活的用户界面,允许用户选择文件或文件夹。针对tkinter默认文件选择器和目录选择器相互独立的限制,我们将介绍一种通过条件逻辑结合使用`filedialog.askopenfilename`和`filedialog.askdirector…
本文深入探讨了在使用`swift-sim`进行机器人仿真时可能遇到的客户端应用错误,特别是由于windows文件路径格式不正确导致模型资源无法加载的问题。文章将分析错误表现,揭示其根源在于库对路径的处理缺陷,并提供具体的解决方案,指导用户如何通过应用社区修复来确保仿真环境的正确运行。 引言:Swif…
在使用`sortedcontainers`库的`sortedset`时,直接修改集合内元素的排序键会导致不可预测的行为和错误。这是因为`sortedset`依赖于其元素的哈希值和排序顺序在集合中保持不变。正确的做法是,在修改任何影响元素排序键的底层数据之前,先将元素从`sortedset`中移除,完…
本文旨在解决 JupyterLab 中已使用 `pip` 安装的模块(例如 `textract`)无法被识别的问题。通常,这与 JupyterLab 使用的 Python 解释器与安装模块的解释器不一致有关。通过正确安装 Jupyter Kernel,确保 JupyterLab 使用正确的环境,从而…
本文详细解析 numpy `einsum` 在处理多张量求和时的内部机制。通过逐步分解求和过程和提供等效的显式循环实现,帮助读者理解 `einsum` 如何根据索引字符串高效地执行元素乘法、重排和特定维度上的求和操作,从而掌握其在复杂张量运算中的应用细节。 NumPy 的 einsum 函数提供了一…
本教程详细介绍了在使用python boto3客户端上传文件到amazon s3时,如何正确地在对象键(即桶内路径)中嵌入和解析python变量。通过使用python的f-string(格式化字符串字面量)功能,开发者可以轻松实现动态路径构建,避免将变量名作为字面量上传,确保文件存储在预期的s3路径…
数据离散化是将连续型数据划分为区间或类别的过程,常用于Python数据分析与机器学习预处理。其作用包括提升模型稳定性、增强可解释性、处理非线性关系及适配算法需求。常用方法有:1. 等宽分箱(pd.cut(s, bins=3))将数据按值域等分;2. 等频分箱(pd.qcut(s, q=4))使每箱样…
将一个类的实例作为另一个类的属性可实现组合关系,如Car类包含Engine实例,使代码模块化、易扩展,清晰表达“has-a”关系,提升可维护性。 在 Python 中,可以将一个类的实例作为另一个类的属性来使用。这种做法很常见,特别是在构建复杂对象关系时,比如组合(Composition)设计模式。…
使用def定义函数,函数名需符合标识符规范且避免关键字,参数可为必需、默认、args或*kwargs形式,函数体需缩进并以冒号结尾,通过return返回结果,否则返回None。 在Python中定义函数需要遵循一些基本规则和语法结构,确保代码的正确性和可读性。函数是组织代码、实现特定功能的基本单元。…
Laplacian算子是一种基于二阶导数的图像边缘检测方法,通过计算∇²f=∂²f/∂x²+∂²f/∂y²检测灰度突变区域。在Python中可用OpenCV的cv2.Laplacian()函数实现,常用3×3卷积核如[0,-1,0;-1,4,-1;0,-1,0]或[-1,-1,-1;-1,8,-1;…
答案:Python中线程同步常用Lock、RLock、Condition、Semaphore和Event机制。1. Lock确保同一时间仅一个线程执行代码段,避免共享资源竞争;2. RLock支持同一线程多次加锁,适用于嵌套调用;3. Condition实现线程间协作,常用于生产者-消费者模型;4.…
本教程详细介绍了如何在pyspark中对dataframe的所有列同时应用多个聚合函数(如`min`和`max`),并以行式结构(每行代表一个聚合结果)展示。通过结合使用`select`进行初步聚合、`cache`优化性能以及`unionbyname`进行结果重塑,实现了灵活且高效的数据分析,避免了…
本教程详细阐述如何在django中为非当前登录用户或匿名用户创建公共资料页面。核心在于通过url参数获取特定用户id,在视图中精确查询该用户数据,并将其传递至模板进行渲染,确保头像和用户名等信息能正确展示,实现灵活的用户资料展示功能。 引言:理解公共资料页面的挑战 在Django应用中,当需要展示任…
本教程详细介绍了如何在使用Boto3 S3客户端上传文件时,利用Python的f-string功能动态构建S3对象键路径。通过实例代码,读者将学习如何避免变量名被字面量解析的问题,确保S3路径能够正确反映变量的实际值,从而实现灵活的文件存储管理。 在使用AWS S3服务时,通过Boto3客户端上传文…
本教程将指导您如何在使用python boto3 s3客户端上传文件时,正确地将变量值嵌入到s3对象路径中。通过详细解释f-string(格式化字符串字面量)的用法,我们将解决路径中出现字面量变量名而非其值的问题,确保您能动态、灵活地构建s3存储路径,实现预期的文件组织结构。 引言:动态S3对象路径…
本教程详细介绍了如何在tkinter应用程序中实现用户同时选择文件或文件夹的功能。通过巧妙地结合`filedialog.askopenfilename`和`filedialog.askdirectory`方法,并辅以逻辑判断,我们可以为用户提供一个灵活的路径选择机制,从而满足多样化的文件系统交互需求…
本文介绍如何在 VS Code 的 launch.json 配置文件中使用环境变量来指定 Python 解释器路径,从而解决在不同机器上虚拟环境路径不同的问题。通过在 settings.json 中设置 python.defaultInterpreterPath,可以绕过 launch.json 中…
本教程详细阐述了如何在 macos pyobjc 应用程序中实现对 mpeg-4 等音频文件的拖放功能。通过正确注册 `nspasteboard` 类型,特别是利用通用类型标识符(uti)和 `nsfilenamespboardtype`,开发者可以准确获取拖入文件的完整路径,从而无缝地将外部音频资…
答案:Python提取字符串可根据位置用切片、按分隔符用split()、通过find()定位、用正则提取复杂内容、或使用strip()等方法处理文本,如提取邮箱、电话、文件名等。 Python 提取字符串内容有多种方式,具体方法取决于你想提取什么类型的内容。以下是几种常见场景和对应的操作方法。 1.…
使用get()方法可安全获取字典中键的值,避免KeyError错误。例如user.get(‘name’)返回’Alice’,user.get(‘phone’)返回None,user.get(‘phone’…