Я совершенно новичок в 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

Как выбрать 2 столбца из user_rdd и создать новый rdd, как показано ниже?

| id | first_name | last_name | full_name
| 1  | Steve      | Kent      | Steve Kent
| 2  | Margaret   | Peace     | Margaret Peace
0
Cryssie 10 Янв 2017 в 11:23

3 ответа

Лучший ответ

Вот, наверное, самый простой способ сделать то, что вам нужно (хотя ваш 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)
2
TDrabas 10 Янв 2017 в 17:01

Не уверен, почему вы хотите сделать это через 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|
+---+----------+---------+--------------+
0
Dat Tran 10 Янв 2017 в 15:44

Вы можете попробовать это:

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())
1
Zhang Tong 10 Янв 2017 в 09:05