我是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
答案 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|
+---+----------+---------+--------------+