假设我有两个 DataFrame——df1
并且df2
——都带有列foo
和bar
. 该列foo
是一个 CRC32 哈希值,例如123456
,该列bar
是一个默认为 的布尔字段False
。
在 pyspark 中,比较foo
两个 DataFrames的值的有效方法是什么bar
,True
在它们不匹配的情况下将列写入。
例如,给定以下两个 DataFrame:
# df1
foo | bar
-------|------
123456 | False
444555 | False
666777 | False
888999 | False
# df2
foo | bar
-------|------
938894 | False
129803 | False
666777 | False
888999 | False
我想要一个如下所示的新 DataFrame,True
其中有两列的哈希值发生了变化:
# df3
foo | bar
-------|------
938894 | True <---
129803 | True <---
666777 | False
888999 | False
任何指导将不胜感激。
在成功使用接受的答案一段时间后,遇到了一种情况使得解决方案不太合适。如果一个连接的 DataFrame 中的多行与连接中foo
另一个 DataFrame 中的一行具有相同的值,则会导致该共享值上的行的笛卡尔积增长。
就我而言,我有基于空字符串的 CRC32 哈希值,这导致0
了哈希值。我还应该补充说,我确实有一个唯一的字符串来匹配行上的行,在id
这里(可能有过于简单的情况),也许这就是要加入的事情:
它会产生这样的情况:
# df1
id |foo | bar
-----|-------|------
abc |123456 | False
def |444555 | False
ghi |0 | False
jkl |0 | False
# df2
id |foo | bar
-----|-------|------
abc |123456 | False
def |999999 | False
ghi |666777 | False
jkl |0 | False
使用选定的答案,会得到一个比所需行数更多的 DataFrame :
# df3
id |foo | bar
-----|-------|------
abc |123456 | False
def |999999 | True <---
ghi |0 | False
jkl |0 | False
jkl |0 | False # extra row add through join
我将保持选择的答案,因为这是对最初提出的问题的一个很好的答案。但是,对于如何处理列foo
可能匹配的DataFrame 的任何建议,将不胜感激。
我在没有id
加入专栏的情况下把问题复杂化了。使用它时,transformed
基于列的直接比较来连接和写入列相对简单fingerprint
:
df2.alias("df2").join(df1.alias("df1"), df1.id == df2.id, 'left')\
.select(f.col('df2.foo'), f.when(df1.fingerprint != df2.fingerprint, f.lit(True)).otherwise(f.col('df2.bar')).alias('bar'))\
.show(truncate=False)
一个化名左连接的df2
使用df1
和使用when
功能来检查不匹配的逻辑应该给你你想要的输出
df2.alias("df2").join(df1.alias("df1"), df1.foo == df2.foo, 'left')\
.select(f.col('df2.foo'), f.when(f.isnull(f.col('df1.foo')), f.lit(True)).otherwise(f.col('df2.bar')).alias('bar'))\
.show(truncate=False)
这应该给你
+------+-----+
|foo |bar |
+------+-----+
|129803|true |
|938894|true |
|888999|false|
|666777|false|
+------+-----+
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句