Python PySpark:基于公共字符串列比较两个数据帧,并生成结果Boolean withColumn()
我有两个数据帧ddf_1和ddf_2,它们共享一个字符串ID的公共列。我的目标是在ddf_1中创建一个新的布尔值is_fine列,如果ID包含在ddf_1和ddf_2中,则该列包含True;如果ID不包含在ddf_1和ddf_2中,则该列包含False 考虑以下示例数据:Python PySpark:基于公共字符串列比较两个数据帧,并生成结果Boolean withColumn(),python,join,pyspark,comparison,conditional-statements,Python,Join,Pyspark,Comparison,Conditional Statements,我有两个数据帧ddf_1和ddf_2,它们共享一个字符串ID的公共列。我的目标是在ddf_1中创建一个新的布尔值is_fine列,如果ID包含在ddf_1和ddf_2中,则该列包含True;如果ID不包含在ddf_1和ddf_2中,则该列包含False 考虑以下示例数据: #### test #example data data_1 = { 'fruits': ["apples", "banana", "cherry"], 'myid': ['1-12', '2-12', '3
#### test
#example data
data_1 = {
'fruits': ["apples", "banana", "cherry"],
'myid': ['1-12', '2-12', '3-13'],
'meat': ["pig", "cow", "chicken"]}
data_2 = {
'furniture': ["table", "chair", "lamp"],
'myid': ['1-12', '0-11', '2-12'],
'clothing': ["pants", "shoes", "socks"]}
df_1 = pd.DataFrame(data_1)
ddf_1 = spark.createDataFrame(df_1)
df_2 = pd.DataFrame(data_2)
ddf_2 = spark.createDataFrame(df_2)
我想象一个类似这样的函数:
def func(df_1, df_2, column_1, column_2):
if df_1.column_1 != df_2.column_2:
return df_1.withColumn('is_fact', False)
else:
return df_1.withColumn('is_fact', True)
return df_1
所需的输出应如下所示:
def func(df_1, df_2, column_1, column_2):
if df_1.column_1 != df_2.column_2:
return df_1.withColumn('is_fact', False)
else:
return df_1.withColumn('is_fact', True)
return df_1
利用Spark SQL解决此类问题:
query = """
select ddf_1.*,
case
when ddf_1.myid = ddf_2.myid then True
else False
end as is_fine
from ddf_1 left outer join ddf_2
on ddf_1.myid = ddf_2.myid
"""
display(spark.sql(query))
这里是您可以在
my\u id
列上的两个数据帧之间执行左外联接,并使用简单的case语句派生is\u fine
列,如下所示
import pyspark.sql.functions as F
ddf_1.join(ddf_2, ddf_1.myid == ddf_2.myid, 'left')\
.withColumn('is_fine', F.when(ddf_2.myid.isNull(), False).otherwise(True))\
.select(ddf_1['fruits'], ddf_1['myid'], ddf_1['meat'], 'is_fine').show()
输出:
+------+----+-------+-------+
|fruits|myid| meat|is_fine|
+------+----+-------+-------+
|cherry|3-13|chicken| false|
|apples|1-12| pig| true|
|banana|2-12| cow| true|
+------+----+-------+-------+
我会用“当ddf_2.myid为NULL时的CASE”代替“当ddf_1.myid=ddf_2.myid时的CASE”,我会得到一个未找到的表或视图:ddf_1;第8行位置5异常。在
ddf_1.createOrReplaceTempView(“ddf_1”)
之前,您需要将数据帧转换为临时视图。具体问题是什么?你试过什么,做过什么研究吗?请看:,。谢谢@noufel13这对我来说太好了。我唯一改变的是使columnselect语句更通用,因为这是伪数据,我通常有很多列要选择,不能单独硬编码每个列。您可以在下面找到代码