我有一个rdd
rdd=sc.parallelize([[True,False,False], [True,True,True], [False,False,True]])
我想将行更改为整数。如果我每行只有三个元素,我可以使用
def asInt(x):
return [int(x[0]), int(x[1]), int(x[2])]
rdd=rdd.map(asInt)
给了我
[[1, 0, 0], [1, 1, 1], [0, 0, 1]]
但我有数百万行,所以我需要一个不同的解决方案。我也接受任何使用DataFrame的解决方案。
答案 0 :(得分:4)
除了手动枚举之外,您的方法看起来没有什么特别的错误。您可以使用简单的列表解析来替换它:
rdd.map(lambda xs: [int(x) for x in xs])
您还可以使用array
代替列表:
import array
rdd.map(lambda xs: array.array('B', xs))
关于DataFrames
:
from pyspark.sql.functions import col
df = rdd.toDF()
df.select(*[col(c).cast("integer") for c in df.columns])
答案 1 :(得分:2)
这是scala答案
val rdd = sparkContext.parallelize( Array( Array( true, false, true ), Array( true, false, false ), Array( false, false, true ) ) )
val res = rdd.map { item => item.map { x => if ( x ) 1 else 0 } }