Pyspark 获取RDD对象中每个列表的长度
我有一个RDD对象,如:Pyspark 获取RDD对象中每个列表的长度,pyspark,rdd,nested-lists,Pyspark,Rdd,Nested Lists,我有一个RDD对象,如: x=[[1,2,3],[4,5,6,7],[7,2,6,9,10]..] 我想从中得到一个列表,它等于每个列表中元素的大小: y=[3,4,5..] Where 3=len([1,2,3], 4=len([4,5,6,7]), 5=len([7,2,6,9,10])... 此语法适用于Python: [len(y)表示列表中的y],如何迭代RDD您只需在RDD中执行映射操作: x=[[1,2,3],[4,5,6,7],[7,2,6,9,10]] rdd=sc.pa
x=[[1,2,3],[4,5,6,7],[7,2,6,9,10]..]
我想从中得到一个列表,它等于每个列表中元素的大小:
y=[3,4,5..]
Where 3=len([1,2,3], 4=len([4,5,6,7]), 5=len([7,2,6,9,10])...
此语法适用于Python:
[len(y)表示列表中的y]
,如何迭代RDD您只需在RDD中执行映射操作:
x=[[1,2,3],[4,5,6,7],[7,2,6,9,10]]
rdd=sc.parallelize(x)
rdd_length=rdd.map(λx:len(x))
rdd_length.collect()
# [3, 4, 5]
您只需在RDD中执行映射操作即可:
x=[[1,2,3],[4,5,6,7],[7,2,6,9,10]]
rdd=sc.parallelize(x)
rdd_length=rdd.map(λx:len(x))
rdd_length.collect()
# [3, 4, 5]
从RDD创建一个数据帧,然后可以使用size()
sql函数
df = spark.createDataFrame([([1, 2, 3],),([4,5,6,7],),([7,2,6,9,10],)], ['data'])
df.select(size(df.data)).collect()
#[Row(size(data)=3), Row(size(data)=4), Row(size(data)=5)]
更新
您可以从原始RDD创建数据帧,如下所示:
from pyspark.sql import Row
rowrdd = rdd.map(lambda x: Row(data=x))
df = spark.createDataFrame(rowrdd)
...
从RDD创建一个数据帧,然后可以使用size()
sql函数
df = spark.createDataFrame([([1, 2, 3],),([4,5,6,7],),([7,2,6,9,10],)], ['data'])
df.select(size(df.data)).collect()
#[Row(size(data)=3), Row(size(data)=4), Row(size(data)=5)]
更新
您可以从原始RDD创建数据帧,如下所示:
from pyspark.sql import Row
rowrdd = rdd.map(lambda x: Row(data=x))
df = spark.createDataFrame(rowrdd)
...
执行起来要花很多时间,我是否需要使用sc.parallelize,因为RDD?@munisc.parallelize
仅用于将非RDD数据(x
在我的示例中)转换为RDD,以便于说明;如果你已经有了RDD,你就不应该使用它,你应该从我上面代码的RDD_长度
部分开始……因此,有近5m的记录,每个记录可能有50-200个元素。它能固定吗?@muni很难说(你问了一个非常具体的问题,答案就在这个问题上),但是Spark中的dataframeapi对于PySpark应用程序来说可能更快。检查另一个答案的性能…您可以尝试增加分区的数量。执行时需要花费大量时间,我是否需要使用sc.parallelize,用于RDD?@munisc.parallelize
仅用于将非RDD数据(x
在我的示例中)转换为RDD,以便于说明;如果你已经有了RDD,你就不应该使用它,你应该从我上面代码的RDD_长度
部分开始……因此,有近5m的记录,每个记录可能有50-200个元素。它能固定吗?@muni很难说(你问了一个非常具体的问题,答案就在这个问题上),但是Spark中的dataframeapi对于PySpark应用程序来说可能更快。检查另一个答案的性能…您可以尝试增加分区数。如果createDataFrame
的参数是RDD,那么这将不起作用,因为OP asksThis只接受每个列表的第一个元素!您应该将其更改为Row(data=x)
…如果createDataFrame
的参数是RDD,这将不起作用,因为OP asksThis只接受每个列表的第一个元素!您应该将其更改为行(data=x)
。。。