Как преобразовать список в несколько столбцов и датафрейм?

Вопрос или проблема

У меня сегодня задача:

Имея список путей S3 в списке, разделить это и получить DataFrame с одним столбцом с путем и новым столбцом только с названием папки.

Мой список содержит следующее:

raw/ingest_date=20240918/eventos/
raw/ingest_date=20240918/llamadas/
raw/ingest_date=20240918/campanhas/
raw/ingest_date=20240918/miembros/
raw/ingest_date=20240918/objetivos/

Я попробовал этот код:

new_dict = []
for folder in subfolders:
    new_dict.append(folder)
    name = folder.split("/", -1)
    new_dict.append(name[2])
    #print(name)

print(type(new_dict))
for elem in new_dict:
    print(elem) 

df = spark.createDataFrame(new_dict, ["s3_prefix", "table_name"])
df.show()

Но результат получается списком, как:

raw/ingest_date=20240918/eventos/
eventos
raw/ingest_date=20240918/llamadas/
llamadas
raw/ingest_date=20240918/campanhas/
campanhas
...
...

Но когда я пытаюсь напечатать мой DataFrame, я вижу следующее:

TypeError: Не удается определить схему для типа: <class ‘str’>

Идея заключается в том, чтобы получить DataFrame как :

s3_prefix                            | table_name
------------------------------------------------------
raw/ingest_date=20240918/eventos/    | eventos
raw/ingest_date=20240918/llamadas/   | llamadas
raw/ingest_date=20240918/campanhas/  | campanhas
raw/ingest_date=20240918/miembros/   | miembros

Может кто-нибудь помочь решить эту задачу?

С уважением

Просто используйте кортежи в этом случае или список кортежей, первый элемент – полный путь (s3_prefix), а второй элемент – последнее название папки, в вашем случае это название таблицы.

data_T – это список кортежей (s3_prefix, table_name)

data_T =[(folder, folder.split("https://stackoverflow.com/")[-2]) for folder in subfolders]

А затем

df = spark.createDataFrame(data_T , ["s3_prefix", "table_name"])

Ответ или решение

Конечно! Давайте разберём ваш запрос и создадим DataFrame из списка путей S3, извлекая из каждого пути имя папки. Делаем это в несколько шагов.

Шаги для решения задачи:

  1. Подготовим ваш список путей: Убедимся, что мы имеем список путей S3, который будет использоваться.
  2. Извлечём имя папки: Для каждого пути извлечём имя папки, расположенное на уровне, который вам нужен.
  3. Создадим список кортежей: Каждый кортеж будет содержать путь S3 и соответствующее имя папки.
  4. Создадим DataFrame: Используем Spark для создания DataFrame из списка кортежей.

Пример кода:

from pyspark.sql import SparkSession

# Создаем экземпляр SparkSession
spark = SparkSession.builder.appName("S3PathsToDataFrame").getOrCreate()

# Ваш начальный список
subfolders = [
    "raw/ingest_date=20240918/eventos/",
    "raw/ingest_date=20240918/llamadas/",
    "raw/ingest_date=20240918/campanhas/",
    "raw/ingest_date=20240918/miembros/",
    "raw/ingest_date=20240918/objetivos/"
]

# Извлекаем необходимые данные и создаем список кортежей
data_tuples = [(folder, folder.split("/")[-2]) for folder in subfolders]

# Создаем DataFrame из списка кортежей
df = spark.createDataFrame(data_tuples, ["s3_prefix", "table_name"])

# Выводим DataFrame
df.show()

Объяснение кода:

  1. Импорт библиотеки: В начале мы импортируем необходимые модули из библиотеки PySpark.
  2. Создание SparkSession: Это обязательный шаг для работы с API Spark.
  3. Список путей: Мы создаём список subfolders с вашими путями S3.
  4. Извлечение данных: Мы используем списковое включение (list comprehension), чтобы создать список кортежей (где первый элемент — путь, а второй — имя папки).
    • folder.split("/")[-2] извлекает имя папки, находя последний разделённый элемент перед завершающим слэшем.
  5. Создание DataFrame: С помощью метода createDataFrame мы создаём DataFrame, указывая имена столбцов.
  6. Вывод результата: Метод show() используется для отображения содержимого DataFrame.

Вывод:

При запуске этого кода вы получите DataFrame с двумя столбцами: s3_prefix (путь к S3) и table_name (имя папки), как и ожидалось:

+--------------------------------------------+------------+
|s3_prefix                                   |table_name  |
+--------------------------------------------+------------+
|raw/ingest_date=20240918/eventos/          |eventos     |
|raw/ingest_date=20240918/llamadas/         |llamadas    |
|raw/ingest_date=20240918/campanhas/        |campanhas   |
|raw/ingest_date=20240918/miembros/         |miembros    |
|raw/ingest_date=20240918/objetivos/        |objetivos   |
+--------------------------------------------+------------+

Если у вас возникнут дополнительные вопросы или потребуется более детальное объяснение, не стесняйтесь обратиться!

Оцените материал
Добавить комментарий

Капча загружается...