我試圖用來filter查找那些不在list_A.
A = B.groupBy("title").count()
A = A.filter(A['count'] > 1)
A_df = A.toPandas()
list_A = A_df['title'].values.tolist()
B.filter(~B.title.isin(list_A)).count()
但是,我得到一個空資料框(計數為 0)

當我使用'is in'時效果很好:

為什么會發生這種情況,我該如何解決?
我試過了:
B=B.na.drop(subset=["title"])
B.filter(~B.title.isin(list_A)).count()
print(B.filter(~B.title.isin(list_A) | B.title.isNull()).count())
它仍然回傳 0。
uj5u.com熱心網友回復:
這可能是因為其他“標題”值為空。
B = spark.createDataFrame([('x',), ('x',), (None,)], ['title'])
A = B.groupBy("title").count()
A = A.filter(A['count'] > 1)
A_df = A.toPandas()
list_A = A_df['title'].values.tolist()
print(B.filter(~B.title.isin(list_A)).count())
# 0
print(B.filter(B.title.isin(list_A)).count())
# 2
如果你真的需要list_A,你不應該去 Pandas 那里。
您可以使用
collectA = B.groupBy("title").count().filter(F.col('count') > 1) list_A = [x.title for x in A.collect()] print(list_A) # ['x', None]或者
collect_setlist_A = (B .groupBy("title").count() .groupBy((F.col('count') > 1).alias('_c')).agg( F.collect_set('title').alias('_t') ).filter('_c') .head()[1] ) print(list_A) # ['x']
最后,要將當前查詢轉換為 PySpark,您應該使用視窗函式。
輸入:
from pyspark.sql import functions as F, Window as W
B = spark.createDataFrame(
[('x', 'Example'),
('x', 'Example'),
('x', 'not_example'),
('y', 'not_example'),
(None, 'not_example'),
(None, 'Example')],
['title', 'journal'])
您當前的腳本:
A = B.groupBy("title").count()
A = A.filter(A['count'] > 1)
A_df = A.toPandas()
list_A = A_df['title'].values.tolist()
B.filter(((B.title.isin(list_A))&(B.journal!="Example"))|(~B.title.isin(list_A)))
建議:
B_filtered = (B
.withColumn('A_cnt', F.count('title').over(W.partitionBy('title')))
.filter("(A_cnt > 1 and journal != 'Example') or A_cnt <= 1")
.drop('A_cnt')
)
B_filtered.show()
# ----- -----------
# |title| journal|
# ----- -----------
# | null|not_example|
# | null| Example|
# | x|not_example|
# | y|not_example|
# ----- -----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/524760.html
