Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PySpark-在所有列中拆分数组并合并为行_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 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

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   |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()

你能假设数组的长度吗?例如,它们总是一样的吗?它们与列数相同吗?数组的长度和列数不同,并且是动态的。玩具问题是,当列表中的项目数和列数是动态的时,它可以按预期工作,但很难管理。