我有静态列表 group_1
以及 group_2
:
group_1 = [a,b,c,d,e,f,g]
group_2 = [h,i,j,k]
我有PyparkDataframe df1
如下所示。
例1:
df1型:
+-----+----------------------------------------+-----------------------------------------+
|id |array1 |array2 |
+-----+----------------------------------------+-----------------------------------------+
|id1 |[a,b,c,d,group_1,group_2] |[a,b,c,d,e,f,g,h,i,j,k] |
+-----+----------------------------------------+-----------------------------------------+
输出功率因数:
+-----+-------------------|-------------------|
|id |col1 |col2 |
+-----+-------------------|-------------------|
|id1 |[a,b,c,d] |[a,b,c,d] |
|id1 |[e,f,g] |group_1 |
|id1 |[h,i,j,k] |group_2 |
+-----+-------------------|-------------------|
事实上, array2
列将包含来自 array1
列。这就是我的源Dataframe( source_df1
)会的。
如果我们看到 array1
列中有单独的元素,如 (a,b,c,d)
还有 group_1
以及 group_2
但所有这些元素在一起是不同的。
现在我想通过分解这样一种方式来创建pysparkDataframe,即对单个元素和组元素进行分类,如中所示 output_df
.
示例1观察:如果我们看到输出Dataframe output_df
,第二条记录 group_1
只有 [e,f,g]
因为其他元素已经是单个元素的一部分了。
例2:
来源:df1:
+-----+----------------------------------------+-----------------------------------------+
|id |array1 |array2 |
+-----+----------------------------------------+-----------------------------------------+
|id1 |[a,b,group_1,group_2] |[a,b,c,d,e,f,g,h,i,j,k] |
+-----+----------------------------------------+-----------------------------------------+
输出功率因数:
+-----+-------------------|-------------------|
|id |col1 |col2 |
+-----+-------------------|-------------------|
|id1 |[a,b] |[a,b] |
|id1 |[c,d,e,f,g] |group_1 |
|id1 |[h,i,j,k] |group_2 |
+-----+-------------------|-------------------|
示例2观察:如果我们看到输出Dataframe output_df
. 第二条记录 group_1
只有 [c,d,e,f,g]
因为其他元素已经是单个元素的一部分了。
有谁能帮忙实现这个目标吗?
1条答案
按热度按时间mrphzbgm1#
如果可以使用spark 2.4+,可以通过一些数组函数来实现:
说明:
首先,划分
array1
分成三个阵列:individual
,group_1
以及group_2
. 每一个都包含对应组的元素。元素来自group_1
以及group_2
存在于individual
从这些组中删除。然后,使用
array_intersect
函数从中获取元素array2
列,这些列分别存在于上面创建的三个组数组中。最后,分解上面创建的新数组
请注意,如果要验证
group_1
或者group_2
存在于array1
可以使用的列when
与array_contains
功能:在这个例子中,我假设它总是出现在
array1
.