PySpark:如何在pyspark Dataframe 中根据值拆分数组,并在对应的另一个数组类型的列中反映相同

2fjabf4q  于 2023-03-30  发布在  Apache
关注(0)|答案(1)|浏览(186)

我有一个Pyspark数据框架:
| 伊茨|人名|
| --------------|--------------|
| [一、一、二、三、一、二、三、七、五]|[a,B,c,l,s,o,c,d,e]|
| [3,8,9,3,9,0,0,6,7,8]|[s,l,h,p,q,g,c,d,p,s]|
| [9,6,5,4,7,6,5,9,2,5,5,4,7]|[q,a,z,w,s,e,r,t,y,o,p,a,x]|
我有两列具有相同长度的数组,我想分裂的第一列数组(ids)的基础上值7(包括),如[1,2,3,7,4,6,7] => [[1,2,3,7],[4,6,7]]
如果我们只有一个7,那么在拆分后我们将只有一个数组,例如[1,2,3,4,7,8,0,5] => [[1,2,3,4,7]]在7之后,如果没有7,则没有使用它
同样的应该反映在另一列(名称)上,它们也在数组的相同索引值上进行拆分,并且也产生相同的长度结果,因为每个id都与每个名称相连,因此我们需要获得与name列相同的拆分ids
输出应为:
| 伊茨|人名|ids_splited|名称_分割|
| --------------|--------------|--------------|--------------|
| [一、一、二、三、一、二、三、七、五]|[a,B,c,l,s,o,c,d,e]|1,1,2,3,1,2,3,7|a,B,c,l,s,o,c,d|
| [3,8,9,3,9,0,0,6,7,8]|[s,l,h,p,q,g,c,d,p,s]|3、8、9、3、9、0、0、6、7|s,l,h,p,q,g,c,d,p|
| [9,6,5,4,7,6,5,9,2,5,5,4,7]|[q,a,z,w,s,e,r,t,y,o,p,a,x]|[[9、6、5、4、7]、[6、5、9、2、5、5、4、7]]|[[q,a,z,w,s],[e,r,t,y,o,p,a,x]]|
我已经尝试了许多选择,但我无法得到这个解决。
先谢谢你了。

qmb5sa22

qmb5sa221#

rdd + map快速解决方案

def split(r):
    A, B = [], []
    a, b = [], []

    for x, y in zip(*r):
        if x != 7:
            a.append(x)
            b.append(y)
        else:
            A.append([*a, x])
            B.append([*b, y])

            a, b = [], [] # reset
    return [*r, A, B]

result = df.rdd.map(split).toDF(['ids', 'names', 'ids_splited', 'names_splited'])

结果

+---------------------------------------+---------------------------------------+-------------------------------------------+-------------------------------------------+
|ids                                    |names                                  |ids_splited                                |names_splited                              |
+---------------------------------------+---------------------------------------+-------------------------------------------+-------------------------------------------+
|[1, 1, 2, 3, 1, 2, 3, 7, 5]            |[a, b, c, l, s, o, c, d, e]            |[[1, 1, 2, 3, 1, 2, 3, 7]]                 |[[a, b, c, l, s, o, c, d]]                 |
|[3, 8, 9, 3, 9, 0, 0, 6, 7, 8]         |[s, l, h, p, q, g, c, d, p, s]         |[[3, 8, 9, 3, 9, 0, 0, 6, 7]]              |[[s, l, h, p, q, g, c, d, p]]              |
|[9, 6, 5, 4, 7, 6, 5, 9, 2, 5, 5, 4, 7]|[q, a, z, w, s, e, r, t, y, o, p, a, x]|[[9, 6, 5, 4, 7], [6, 5, 9, 2, 5, 5, 4, 7]]|[[q, a, z, w, s], [e, r, t, y, o, p, a, x]]|
+---------------------------------------+---------------------------------------+-------------------------------------------+-------------------------------------------+

相关问题