Как можно преобразовать линейный список PySpark RDD в DataFrame?

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

a = ["a1", "a2", "a3", b1", "b2", "b3", "c1", "c2", "c3"]

Ожидаемый результат,

+--------------------+
| col1 | col2 | col3 |
+--------------------+
|  a1  |  a2  |  a3  |
|  b1  |  b2  |  b3  |
|  c1  |  c2  |  c3  |
+--------------------+

Я попробовал следующее, но получил ошибку.

from pyspark.sql.types import *

a = ["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"]

rdd = sc.parallelize(a)

schema = StructType([
     StructField("a", StringType(), True),
     StructField("b", StringType(), True),
     StructField("c", StringType(), True)
     ])

df = sqlContext.createDataFrame(rdd, schema)

df.show()

Последний оператор show() получает ошибку «Задание прервано из-за сбоя этапа». Пожалуйста, кто-нибудь скажите мне решение? Спасибо.

Вам нужно преобразовать a в форму: [('a1', 'a2', 'a3'), ('b1', 'b2', 'b3'), ('c1', 'c2', 'c3')]

pault 08.04.2019 18:13

Список дан, поэтому переписать его нельзя. Ищите что-то похожее на «изменить форму» в NumPy.

Pika365 09.04.2019 02:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот способ, который, надеюсь, соответствует вашим критериям

# First get a 1 column DF
df = sql.createDataFrame(sc.parallelize(a).map(lambda x: [x]), schema=['col'])
# split each value into a number and letter e.g. 'a1' --> ['a','1']) 
df = df.withColumn('letter', f.split('col', '').getItem(0))
df = df.withColumn('number', f.split('col', '').getItem(1))

# Now pivot to get what you want (dropping extraneous columns and ordering 
# to get exact output

output = (df.groupBy('letter')
          .pivot('number')
          .agg(f.first('col'))
          .select([f.col(column).alias('col%s'%(column)) for column in ['1','2','3']])
          .orderBy('col1')
          .drop('letter'))

Я вполне уверен, что a1, a2, ... и т. д. были примерами и не должны восприниматься как буквальные значения.

pault 09.04.2019 17:10

на самом деле я думаю, что это немного двусмысленно, я интерпретировал это как последовательность из 4 типов (a, b и c) с показанными только 3 лучшими примерами каждого (т.е. подмножество гораздо большего списка a, b и c с соответствующим индексом числа). Однако на самом деле ни один из нас не может сказать, что правильно.

ags29 09.04.2019 21:17

Согласитесь, двусмысленно. Я исхожу из комментария, что OP ищет что-то похожее на изменение формы numpy.

pault 09.04.2019 21:29

Спасибо ages29 и pault, извините за двусмысленность. Я подтвердил, что решение pault было тем, что я ожидал. Спасибо еще раз!

Pika365 10.04.2019 03:18
Ответ принят как подходящий

Основываясь на вашем комментарий, я предполагаю, что вы начинаете с rdd, а не со списка.

Я также предполагаю, что вы определяете порядок на основе индекса rdd. Если эти предположения верны, вы можете использовать zipWithIndex(), чтобы добавить номер строки к каждой записи.

Затем разделите номер строки на 3 (используйте целочисленное деление), чтобы сгруппировать каждые 3 последовательные записи. Затем используйте groupByKey(), чтобы объединить записи с одним и тем же key в кортеж.

Наконец, опустите ключ и позвоните toDF()

rdd.zipWithIndex()\
    .map(lambda row: (row[1]//3, row[0]))\
    .groupByKey()\
    .map(lambda row: tuple(row[1]))\
    .toDF(["a", "b", "c"])\
    .show()
#+---+---+---+
#|  a|  b|  c|
#+---+---+---+
#| a1| a2| a3|
#| c1| c2| c3|
#| b1| b2| b3|
#+---+---+---+

Другие вопросы по теме

Похожие вопросы

Как добавить совершенно нерелевантный столбец во фрейм данных при использовании pyspark, spark + databricks
Как отправить slurm job, используя много воркеров, а не просто работая в локальном режиме?
Создать уникальный идентификатор для комбинации пары значений из двух столбцов в фрейме данных искры
Как использовать aggregateBykey для получения списка значений для каждого ключа?
Включить метрику Spark в LucidWorks Fusion
Как разобрать JSON, содержащий строковое свойство, представляющее JSON
Фильтрация кадров данных, обусловленных несколькими столбцами, с различными условиями в зависимости от значений столбца
Динамически зацикливать набор данных для всех имен столбцов
Как получить данные второго фрейма данных для всех значений определенных значений столбцов, совпадающих в первом фрейме данных?
Как сравнить две таблицы и заменить нули значениями из другой таблицы