pyspark 将数组传递到数据块中的isin()函数

hc8w905p  于 2023-02-18  发布在  Spark
关注(0)|答案(1)|浏览(201)

我有一个要求,如果一个df出现在一个数组中,我将不得不过滤记录。所以我有一个数组,它是不同于另一个df的列的值,如下所示。

dist_eventCodes = Event_code.select('Value').distinct().collect()

现在,我在如下所示的过滤器中传递这个dist_eventCodes。

ADT_df_select = ADT_df.filter(ADT_df.eventTypeCode.isin(dist_eventCodes))

当我运行这段代码时,我得到下面的错误消息

"AttributeError: 'DataFrame' object has no attribute '_get_object_id'"

谁能帮帮我我到底做错了什么?
先谢了

fjnneemd

fjnneemd1#

如果我没有理解错的话,您只需要保留eventTypeCode在Event_code Dataframe 的eventTypeCode范围内的那些行
如果不是这样,请告诉我
这可以通过spark中一个简单的left-semi join来实现,这样你就不需要收集 Dataframe ,这在分布式环境中是正确的。

ADT_df.alias("df1").join(Event_code.select("value").distinct().alias("df2"), [F.col("df1.eventTypeCode")=F.col("df2.value")], 'leftsemi')

或者如果有使用isin的特定需要,这将起作用(collect_set将处理distinct):

dist_eventCodes = Event_code.select("value").groupBy(F.lit("dummy")).agg(F.collect_set("value").alias("value")).first().asDict()
ADT_df_select = ADT_df.filter(ADT_df["eventTypeCode"].isin(dist_eventCodes["value"]))

输入(ADT_df):

事件代码 Dataframe :

输出:

相关问题