Apache spark PySpark-在所有列中拆分数组并合并为行
PySpark中是否有一种方法可以同时分解所有列中的数组/列表,并将分解后的数据分别合并/压缩到行中 列的数量可能是动态的,这取决于其他因素 从数据帧Apache spark PySpark-在所有列中拆分数组并合并为行,apache-spark,pyspark,Apache Spark,Pyspark,PySpark中是否有一种方法可以同时分解所有列中的数组/列表,并将分解后的数据分别合并/压缩到行中 列的数量可能是动态的,这取决于其他因素 从数据帧 |col1 |col2 |col3 | |[a,b,c]|[d,e,f]|[g,h,i]| |[j,k,l]|[m,n,o]|[p,q,r]| |col1|col2|col3| |a |d |g | |b |e |h | |c |f |i | |j |m |p | |k |n
|col1 |col2 |col3 |
|[a,b,c]|[d,e,f]|[g,h,i]|
|[j,k,l]|[m,n,o]|[p,q,r]|
|col1|col2|col3|
|a |d |g |
|b |e |h |
|c |f |i |
|j |m |p |
|k |n |q |
|l |o |r |
到数据帧
|col1 |col2 |col3 |
|[a,b,c]|[d,e,f]|[g,h,i]|
|[j,k,l]|[m,n,o]|[p,q,r]|
|col1|col2|col3|
|a |d |g |
|b |e |h |
|c |f |i |
|j |m |p |
|k |n |q |
|l |o |r |
这里有一种方法可以使用
rdd
和flatMap()
:
cols=df.columns
df.rdd.flatMap(lambda x:zip(*[x[c]表示cols中的c])).toDF(cols.show(truncate=False)
#+----+----+----+
#|col1 | col2 | col3|
#+----+----+----+
#|a | d | g|
#|b | e | h|
#|c | f | i|
#|j | m | p|
#|k | n | q|
#|l|o|r|
#+----+----+----+
试试这个
import pyspark.sql.functions as F
from pyspark.sql.types import *
a = [(['a','b','c'],['d','e','f'],['g','h','i']),(['j','k','l'],['m','n','o'],['p','q','r'])]
a = sql.createDataFrame(a,['a','b','c'])
cols = ['col1','col2','col3']
splits = [F.udf(lambda val:val[0],StringType()),F.udf(lambda val:val[1],StringType()),F.udf(lambda val:val[2],StringType())]
def exploding(cols):
return F.explode(F.array([F.struct([F.col(c).getItem(i).alias(c)\
for c in colnames]) for i in range(3)]))
a = a.withColumn("new_col", exploding(["a", "b", "c"]))\
.select([s('new_col').alias(c) for s,c in zip(splits,cols)])
a.show()
你能假设数组的长度吗?例如,它们总是一样的吗?它们与列数相同吗?数组的长度和列数不同,并且是动态的。玩具问题是,当列表中的项目数和列数是动态的时,它可以按预期工作,但很难管理。