如何解决如果列在另一个 Spark Dataframe 中,Pyspark 创建新列
如果列的行位于单独的数据帧中,我正在尝试在我的 Spark 数据帧中创建一个标记。
这是我的主要 Spark 数据框 (df_main
)
+--------+
|main |
+--------+
|28asA017|
|03G12331|
|1567L044|
|02TGasd8|
|1asd3436|
|A1234567|
|B1234567|
+--------+
这是我的参考(df_ref
),这个参考中有数百行,所以我显然不能像这样对它们进行硬编码 solution 或 this one
+--------+
|mask_vl |
+--------+
|A1234567|
|B1234567|
...
+--------+
通常,我会在 Pandas 的数据框中执行以下操作:
df_main['is_inref'] = np.where(df_main['main'].isin(df_ref.mask_vl.values),"YES","NO")
这样我就能得到这个
+--------+--------+
|main |is_inref|
+--------+--------+
|28asA017|NO |
|03G12331|NO |
|1567L044|NO |
|02TGasd8|NO |
|1asd3436|NO |
|A1234567|YES |
|B1234567|YES |
+--------+--------+
df_main = df_main.withColumn('is_inref',"YES" if F.col('main').isin(df_ref) else "NO")
df_main.show(20,False)
解决方法
你很近。我认为您需要的额外步骤是显式创建将包含 df_ref
中的值的列表。
请看下图:
# Create your DataFrames
df = spark.createDataFrame(["28asA017","03G12331","1567L044",'02TGasd8','1asd3436','A1234567','B1234567'],"string").toDF("main")
df_ref = spark.createDataFrame(["A1234567","B1234567"],"string").toDF("mask_vl")
然后,您可以创建一个 list
并使用 isin
,几乎就像您拥有的那样:
# Imports
from pyspark.sql.functions import col,when
# Create a list with the values of your reference DF
mask_vl_list = df_ref.select("mask_vl").rdd.flatMap(lambda x: x).collect()
# Use isin to check whether the values in your column exist in the list
df_main = df_main.withColumn('is_inref',when(col('main').isin(mask_vl_list),'YES').otherwise('NO'))
这会给你:
>>> df_main.show()
+--------+--------+
| main|is_inref|
+--------+--------+
|28asA017| NO|
|03G12331| NO|
|1567L044| NO|
|02TGasd8| NO|
|1asd3436| NO|
|A1234567| YES|
|B1234567| YES|
+--------+--------+
,
如果你想避免收集,我建议你做下一个:
df_ref= df_ref
.withColumnRenamed("mask_v1","main")
.withColumn("isPreset",lit("yes"))
main_df= main_df.join(df_ref,Seq("main"),"left_outer")
.withColumn("is_inref",when(col("isPresent").isNull,lit("NO")).otherwise(lit("YES")))
,
我觉得这个问题已经回答了,你可以在这里查看 spark detecting the unchanged rows
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。