在Python中从另一个rdd创建一个新的rdd

时间:2017-01-10 08:23:01

标签: python pyspark rdd

我是pysparks和rdd的新手。我试图了解rdd是如何工作的,我在访问rdd中的部分数据时遇到了问题。我想从现有的rdd中选择几个列并创建一个新的rdd。

以下示例:

user_rdd = [Row(id=u'1', first_name=u'Steve', last_name=u'Kent', email=u's.kent@email.com'),Row(id=u'2', first_name=u'Margaret', last_name=u'Peace', email=u'marge.peace@email.com')]

display(user_rdd)

| email                 | first_name | id | last_name
| s.kent@email.com      | Steve      | 1  | Kent
| marge.peace@email.com | Margaret   | 2  | Peace

如何从user_rdd中选择2列并创建一个新的rdd,如下所示?

| id | first_name | last_name | full_name
| 1  | Steve      | Kent      | Steve Kent
| 2  | Margaret   | Peace     | Margaret Peace

3 个答案:

答案 0 :(得分:2)

这可能是你做的事情最简单的方法(虽然你的RDD看起来像是来自DataFrame

from pyspark.sql import Row

user_rdd = sc.parallelize([
    Row(id=u'1', 
        first_name=u'Steve', 
        last_name=u'Kent', 
        email=u's.kent@email.com'),
    Row(id=u'2', 
        first_name=u'Margaret', 
        last_name=u'Peace', 
        email=u'marge.peace@email.com')
])

new_rdd = user_rdd.map(lambda row: Row(
        first_name=row.first_name, 
        last_name=row.last_name, 
        full_name=row.first_name + ' ' + row.last_name))

new_rdd.take(2)

答案 1 :(得分:1)

你可以试试这个:

sc = SparkContext(conf=conf)
user_rdd = [Row(id=u'1', first_name=u'Steve', last_name=u'Kent', email=u's.kent@email.com'),
            Row(id=u'2', first_name=u'Margaret', last_name=u'Peace', email=u'marge.peace@email.com')]
rdd = sc.parallelize(user_rdd).map(lambda x: Row(fullname=' '.join([x['first_name'], x['last_name']]), **x.asDict()))
print(rdd.collect())

答案 2 :(得分:0)

不确定为什么要通过RDD执行此操作,因为行列表本质上是一个DataFrame,并且更容易选择列并在那里连接它。它也比使用RDD更有效。

from pyspark.sql import Row
from pyspark.sql.functions import concat_ws

user_rdd = [Row(id=u'1', first_name=u'Steve', last_name=u'Kent', email=u's.kent@email.com'),Row(id=u'2', first_name=u'Margaret', last_name=u'Peace', email=u'marge.peace@email.com')]

user_df = spark_session.createDataFrame(user_rdd)

user_df.select(user_df.id, user_df.first_name, user_df.last_name,  concat_ws(' ',user_df.first_name, user_df.last_name).alias('full_name')).show()

这将为您提供输出为DataFrame:

+---+----------+---------+--------------+
| id|first_name|last_name|     full_name|
+---+----------+---------+--------------+
|  1|     Steve|     Kent|    Steve Kent|
|  2|  Margaret|    Peace|Margaret Peace|
+---+----------+---------+--------------+