gpt4 book ai didi

python - 分解两个 PySpark 数组并保留相同位置的元素

转载 作者:行者123 更新时间:2023-12-01 00:17:22 25 4
gpt4 key购买 nike

我有一个 PySpark 数据框(例如 df1),其中包含以下列

1.> category :一些字符串2.> array1 :元素数组3.> array2 :元素数组

以下是df1的示例

+--------+--------------+--------------+
|category| array1| array2|
+--------+--------------+--------------+
|A | [x1, x2, x3]| [y1, y2, y3]|
|B | [u1, u2]| [v1, v2]|
+--------+--------------+--------------+

对于每一行,array1 的长度等于array2 的长度。在每一列中,我希望不同的行具有不同大小的数组 array1 (和 array2)。

我想形成单独的列(例如 element1element2),以便在每一行中,列 element1element2 分别包含来自 array1array2 相同位置的元素。

以下是我想要的输出数据帧(例如df2)的示例:

+--------+--------------+--------------+----------+----------+
|category| array1| array2| element1| element2|
+--------+--------------+--------------+----------+----------+
|A | [x1, x2, x3]| [y1, y2, y3]| x1| y1|
|A | [x1, x2, x3]| [y1, y2, y3]| x2| y2|
|A | [x1, x2, x3]| [y1, y2, y3]| x3| y3|
|B | [u1, u2]| [v1, v2]| u1| v1|
|B | [u1, u2]| [v1, v2]| u2| v2|
+--------+--------------+--------------+----------+----------+

下面是我到目前为止所尝试过的(但除了我想要的之外,它还为我提供了来自不同位置的 element1element2 中的值。)

df2 = df1.select( "*", F.explode("array1").alias("element1") ).select( "*", F.explode("array2").alias("element2") ) 

最佳答案

初始化

import pyspark.sql.functions as F

sc = pyspark.SparkContext()
sqlContext = SQLContext(sc)

columns = ['category','array1','array2']
vals = [
('A', ['x1', 'x2', 'x3'], ['y1','y2','y3']),
('B', ['u1', 'u2',], ['v1','v2'])
]
df = sqlContext.createDataFrame(vals, columns)

Based on arrays_zip [docs]在 Spark >= 2.4

df.withColumn('new', F.arrays_zip('array1','array2')).withColumn('ex',explode('new'))\
.select('category','array1','array2',
col("ex.array1").alias('element1'),
col("ex.array2").alias('element2')\
).drop('new','ex').show()

输出

+--------+------------+------------+--------+--------+
|category| array1| array2|element1|element2|
+--------+------------+------------+--------+--------+
| A|[x1, x2, x3]|[y1, y2, y3]| x1| y1|
| A|[x1, x2, x3]|[y1, y2, y3]| x2| y2|
| A|[x1, x2, x3]|[y1, y2, y3]| x3| y3|
| B| [u1, u2]| [v1, v2]| u1| v1|
| B| [u1, u2]| [v1, v2]| u2| v2|
+--------+------------+------------+--------+--------+

说明查看 arrays_zip 生成的内容基本上可以解释一切。我们将列与它合并/压缩在一起,然后分解它。然后只需在由explode创建的新列中引用相应的结构即可。

>>> df.withColumn('new', F.arrays_zip('array1','array2')).show(truncate=False)
+--------+------------+------------+------------------------------+
|category|array1 |array2 |new |
+--------+------------+------------+------------------------------+
|A |[x1, x2, x3]|[y1, y2, y3]|[[x1, y1], [x2, y2], [x3, y3]]|
|B |[u1, u2] |[v1, v2] |[[u1, v1], [u2, v2]] |
+--------+------------+------------+------------------------------+

关于python - 分解两个 PySpark 数组并保留相同位置的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59235308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com