我有一个名为original_df
的嵌套框架,它的列数是可变的,还有另外两个嵌套框架delete_df
和insert_df
。
original_df =
+---+----+----+---+
| s| p1| p2| p3|
+---+----+----+---+
| s1| o1| o2| o7|
| s1| o2| o2| o7|
| s2| o3|null| o4|
| s3|null| o5| o6|
| s4|null|null| o6|
+---+----+----+---+
delete_df =
+---+---+---+
| s| p| o|
+---+---+---+
| s1| p3| o7|
| s2| p1| o3|
| s4| p3| o6|
+---+---+---+
insert_df =
+---+---+---+
| s| p| o|
+---+---+---+
| s1| p3| o8|
| s5| p2| o9|
+---+---+---+
final_df =
+---+----+----+----+
| s| p1| p2| p3|
+---+----+----+----+
| s1| o1| o2| o8|
| s1| o2| o2| o8|
| s2|null|null| o4|
| s3|null| o5| o6|
| s5|null| o9|null|
+---+----+----+----+
如果delete_df
中特定p
的元组(s, o)
属于original_df
中的(s, P)
,其中P
可以是p1
、p2
、p3
等。(P
是变量;它可以具有任意数量的列。)则对于特定的s
,final_df
中的列P
的值将是null
。
示例:final_df
具有元组(s2, null, null, o4)
,因为delete_df
具有元组(s2, p1, o3)
。
+---+----+----+---+
| s| p1| p2| p3|
+---+----+----+---+
| s1| o1| o2| o7|
| s1| o2| o2| o7|
| s2|null|null| o4|
| s3|null| o5| o6|
| s4|null|null| o6|
+---+----+----+---+
类似地,我们将得到delete_df
的(s1, p3, o7)
和(s4, p3, o6)
元组的以下df。
+---+----+----+----+
| s| p1| p2| p3|
+---+----+----+----+
| s1| o1| o2|null|
| s1| o2| o2|null|
| s2|null|null| o4|
| s3|null| o5| o6|
| s4|null|null|null|
+---+----+----+----+
我们还必须从final_df
中删除记录,如果所有列p1
,p2
,p3
等。对于特定的s
值,具有null
值。
例如:我们在final_df
中有(s4, null, null, null)
,因为delete_df
中有(s4, p3, o6)
。我们将从final_df
中丢弃此记录,因为所有P
列都有null
值。
+---+----+----+----+
| s| p1| p2| p3|
+---+----+----+----+
| s1| o1| o2|null|
| s1| o2| o2|null|
| s2|null|null| o4|
| s3|null| o5| o6|
+---+----+----+----+
insert_df
将用于将记录插入final_df
。示例:我们将获得insert_df
的元组(s1, p3, o8)
的以下df。
+---+----+----+----+
| s| p1| p2| p3|
+---+----+----+----+
| s1| o1| o2| o8|
| s1| o2| o2| o8|
| s2|null|null| o4|
| s3|null| o5| o6|
+---+----+----+----+
请让我知道如何有效地从original_df
使用delete_df
和insert_df
在Scala中实现final_df
。
3条答案
按热度按时间cu6pst1q1#
下面是另一种方法,与我之前提出的方法非常相似,但不涉及
original_df
的爆炸。相反,我们可以用s
对insert_df
和delete_df
进行分组,并在p
上旋转,使它们具有与original_df
相同的结构。然后,我们加入s
并应用您在问题中描述的逻辑。最后,我们仍然需要删除所有p列都为null的行:8yparm6h2#
如果
delete_df
和insert_df
足够小,可以收集到驱动程序中并在when
子句中使用,那么这可能是最有效的方法。在一般情况下,如果不能做出这样的假设,我建议将
original_df
分解如下:然后用
[s,p,o]
上的delete_df
连接这个分解的框架,找出需要删除的内容,用[s,p]
上的insert_df
插入需要插入的内容。然后我们可以按s
分组,并在p
上旋转,以获得final_df
代码如下:
由于
s
列中可以有重复项,因此还有一个额外的微妙之处。为了能够在旋转时返回所有行,我们需要一个唯一的行id
来跟踪哪些值属于哪一行。snvhrwxg3#
python中的代码!
在这里,你有另一种方法来做到这一点。它不使用
groupBy().pivot()
,而是使用Array
和Map
操作,如array_except
和array_union
。奥利的解决方案似乎更清晰和有效,但我花了太多的时间不张贴我的解决方案!😊