Как взорвать несколько столбцов данных в pyspark - PullRequest
0 голосов
/ 28 июня 2018

У меня есть датафрейм, который состоит из списков в столбцах, подобных следующему. Длина списков во всех столбцах не одинакова.

Name  Age  Subjects                  Grades
[Bob] [16] [Maths,Physics,Chemistry] [A,B,C]

Я хочу разбить фрейм данных таким образом, чтобы я получил следующий вывод-

Name Age Subjects Grades
Bob  16   Maths     A
Bob  16  Physics    B
Bob  16  Chemistry  C

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Это работает,

import pyspark.sql.functions as F
from pyspark.sql.types import *

df = sql.createDataFrame(
    [(['Bob'], [16], ['Maths','Physics','Chemistry'], ['A','B','C'])],
    ['Name','Age','Subjects', 'Grades'])
df.show()

+-----+----+--------------------+---------+
| Name| Age|            Subjects|   Grades|
+-----+----+--------------------+---------+
|[Bob]|[16]|[Maths, Physics, ...|[A, B, C]|
+-----+----+--------------------+---------+

Используйте udf с zip. Эти столбцы, необходимые для explode, должны быть объединены перед взрывом.

combine = F.udf(lambda x, y: list(zip(x, y)),
              ArrayType(StructType([StructField("subs", StringType()),
                                    StructField("grades", StringType())])))

df = df.withColumn("new", combine("Subjects", "Grades"))\
       .withColumn("new", F.explode("new"))\
       .select("Name", "Age", F.col("new.subs").alias("Subjects"), F.col("new.grades").alias("Grades"))
df.show()


+-----+----+---------+------+
| Name| Age| Subjects|Grades|
+-----+----+---------+------+
|[Bob]|[16]|    Maths|     A|
|[Bob]|[16]|  Physics|     B|
|[Bob]|[16]|Chemistry|     C|
+-----+----+---------+------+
0 голосов
/ 28 июня 2018

Вы пробовали это

df.select(explode(split(col("Subjects"))).alias("Subjects")).show()

Вы можете преобразовать фрейм данных в RDD.

Для СДР вы можете использовать функцию flatMap для разделения субъектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...