python Spark SQL数据集:将多个数组列拆分为单独的行

j9per5c4  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(111)

我是Spark SQL和Dataset / Dataframe API的新手。
我的数据集中有两列都有多个值/数组。
我想按位置逐行遍历数组,并为数组中的每组相应位置条目输出一个新行。你可以从下面的两个图表中看到如何。
例如:

输入dataframe / dataset

+---+---------+-----+
| id|       le|leloc|
+---+---------+-----+
|  1|[aaa,bbb]|[1,2]|
|  2|[ccc,ddd]|[3,4]|
+---+---------+-----+

预期输出数据集

我需要输出如下,数据从列转换为行:

+---+---------+-----+
| id|       le|leloc|
+---+---------+-----+
|  1|aaa      |1    |
|  1|bbb      |2    |
|  2|ccc      |3    |
|  2|ddd      |4    |
+---+---------+-----+
46qrfjad

46qrfjad1#

%python
from pyspark.sql.functions import *
from pyspark.sql.types import *

# Gen some data
df1 = spark.createDataFrame([   ( 1, list(['A','B','X']), list(['1', '2', '8'])   ) for x in range(2)], ['value1', 'array1', 'array2'] )    
df2 = spark.createDataFrame([   ( 2, list(['C','D','Y']), list(['3', '4', '9'])   ) for x in range(2)], ['value1', 'array1', 'array2'] )  
df = df1.union(df2).distinct()

# from here specifically for you

col_temp_expr = "transform(array1, (x, i) -> concat(x, ',', array2[i]))"

dfA = df.withColumn("col_temp", expr(col_temp_expr))
dfB = dfA.select("value1", "array2", explode((col("col_temp")))) # Not an array
dfC = dfB.withColumn('tempArray', split(dfB['col'], ',')) # Now an array
dfC.select("value1", dfC.tempArray[0], dfC.tempArray[1]).show()

返回:

+------+------------+------------+
|value1|tempArray[0]|tempArray[1]|
+------+------------+------------+
|     1|           A|           1|
|     1|           B|           2|
|     1|           X|           8|
|     2|           C|           3|
|     2|           D|           4|
|     2|           Y|           9|
+------+------------+------------+

您可以重命名cols。每个数组有更多的元素。

相关问题