Apache spark 皮斯帕克。数据帧中的zip数组

Apache spark 皮斯帕克。数据帧中的zip数组,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有以下PySpark数据帧: +------+----------------+ |id |数据| +------+----------------+ | 1| [10, 11, 12]| | 2| [20, 21, 22]| | 3| [30, 31, 32]| +------+----------------+ 最后,我希望有以下数据帧 +--------+----------------------------------+ |id |数据|

我有以下PySpark数据帧:

+------+----------------+
|id |数据|
+------+----------------+
|     1|    [10, 11, 12]|
|     2|    [20, 21, 22]|
|     3|    [30, 31, 32]|
+------+----------------+
最后,我希望有以下数据帧

+--------+----------------------------------+
|id |数据|
+--------+----------------------------------+
| [1,2,3]|[[10,20,30],[11,21,31],[12,22,32]]|
+--------+----------------------------------+
我命令这样做。首先,我提取数据数组,如下所示:

tmp_array=df_test.select(“data”).rdd.flatMap(lambda x:x).collect()
a0=tmp_阵列[0]
a1=tmp_阵列[1]
a2=tmp_阵列[2]
样本=zip(a0、a1、a2)
samples1=sc.parallelize(样本)
通过这种方式,我在示例1中提供了一个包含内容的RDD

[[10,20,30]、[11,21,31]、[12,22,32]]
  • 问题1:这是一个好方法吗

  • 问题2:如何将RDD重新包含到数据帧中


您可以简单地使用
udf
函数作为zip函数,但在此之前,您必须使用
collect\u list
函数

从pyspark.sql导入函数为f
从pyspark.sql导入类型为t
def zipUdf(阵列):
返回zip(*数组)
zipping=f.udf(zipUdf,t.ArrayType(t.ArrayType(t.IntegerType()))
选择(
f、 collect_list(df.id).alias('id'),
压缩(f.collect_list(df.data)).alias('data'))
).show(truncate=False)
那会给你什么

+---------+------------------------------------------------------------------------------+
|id |数据|
+---------+------------------------------------------------------------------------------+
|[1,2,3]|[WrappedArray(10,20,30),WrappedArray(11,21,31),WrappedArray(12,22,32)]|
+---------+------------------------------------------------------------------------------+

这里有一种方法可以获得所需的输出,而无需序列化到
rdd
或使用
udf
。您将需要两个常量:

  • 数据帧中的行数(
    df.count()
  • 数据长度(给定)
在双列表理解中使用和,以您希望使用的顺序选择
“data”
的元素:

导入pyspark.sql.f函数
数据长度=3
numRows=df.count()
选择(
f、 收集列表(“id”)。别名(“id”),
f、 排列(
[
f、 排列(
收集列表(“数据”).getItem(j).getItem(i)
对于范围内的j(numRows)]
) 
对于范围内的i(数据长度)
]
).别名(“数据”)
)\
.show(truncate=False)
#+---------+------------------------------------------------------------------------------+
#|id |数据|
#+---------+------------------------------------------------------------------------------+
#|[1,2,3]|[WrappedArray(10,20,30),WrappedArray(11,21,31),WrappedArray(12,22,32)]|
#+---------+------------------------------------------------------------------------------+

您的数据帧只有2行吗?通常我有超过2行,所以您只想返回一行?<代码>数据< /代码>的长度是一个常数权(我看不出它是如何工作的)。<代码>数据< /代码>的长度可能是不同的,但现在我将认为这是一个常数,通常我有2以上。谢谢,通过将您的udf更改为
return-zip(*array)
@RameshMaharjan,您可以将其概括为2行以上。我希望您不介意,但我编辑了答案,以获得最终答案,这适用于所有情况。我也想这样做,但我想把你的名字写进去,所以我在里面加了@pault谢谢lot@RameshMaharjan我有以下错误:
net.razorvine.pickle.PickleException:构建ClassDict(对于builtins.iter)需要零个参数
你知道可能是什么吗?这太棒了!