Databricks中使用isin()过滤DataFrame报AttributeError问题求助
问题排查与解决
错误原因
你遇到的AttributeError: 'DataFrame' object has no attribute '_get_object_id',本质是因为collect()返回的是Row对象的列表(比如[Row(Value='CODE1'), Row(Value='CODE2')]),而isin()方法需要的是纯基础类型的集合(字符串、数字等)。直接将Row列表传入isin()会导致Spark内部无法正确解析对象类型,从而抛出该错误。
解决方案
方法1:提取Row中的纯值列表(小数据量场景)
将collect()得到的Row列表转换为纯值数组,再传入isin():
# 提取Row中的Value字段,转为纯值列表 dist_eventCodes = [row['Value'] for row in Event_code.select('Value').distinct().collect()] # 执行过滤 filtered_ADT_df = ADT_df.filter(ADT_df.eventTypeCode.isin(dist_eventCodes))
方法2:使用半连接(大数据量推荐)
如果数据量较大,collect()会将数据拉取到Driver节点,可能引发内存问题。推荐使用Spark的半连接(Semi Join),直接在集群端完成过滤,性能更优:
# 重命名列,和ADT_df的eventTypeCode匹配 event_codes_df = Event_code.select('Value').distinct().withColumnRenamed('Value', 'eventTypeCode') # 半连接:只保留ADT_df中存在于event_codes_df的记录 filtered_ADT_df = ADT_df.join(event_codes_df, on='eventTypeCode', how='semi')
半连接的优势是不会引入重复数据,也无需将数据集拉到Driver端,适合大规模数据处理场景。
内容的提问来源于stack exchange,提问作者Darkmaster
相关产品推荐
相关产品推荐

