Apache spark 皮斯帕克。数据帧中的zip数组
我有以下PySpark数据帧: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 |数据|
+------+----------------+
|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)需要零个参数
你知道可能是什么吗?这太棒了!