在rdd中更改数据类型

时间:2016-03-25 22:00:54

标签: python apache-spark pyspark

我有一个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的解决方案。

2 个答案:

答案 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 } }