Вопрос или проблема
У меня сегодня задача:
Имея список путей 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, извлекая из каждого пути имя папки. Делаем это в несколько шагов.
Шаги для решения задачи:
- Подготовим ваш список путей: Убедимся, что мы имеем список путей S3, который будет использоваться.
- Извлечём имя папки: Для каждого пути извлечём имя папки, расположенное на уровне, который вам нужен.
- Создадим список кортежей: Каждый кортеж будет содержать путь S3 и соответствующее имя папки.
- Создадим 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()
Объяснение кода:
- Импорт библиотеки: В начале мы импортируем необходимые модули из библиотеки PySpark.
- Создание
SparkSession
: Это обязательный шаг для работы с API Spark. - Список путей: Мы создаём список
subfolders
с вашими путями S3. - Извлечение данных: Мы используем списковое включение (
list comprehension
), чтобы создать список кортежей (где первый элемент — путь, а второй — имя папки).folder.split("/")[-2]
извлекает имя папки, находя последний разделённый элемент перед завершающим слэшем.
- Создание DataFrame: С помощью метода
createDataFrame
мы создаём DataFrame, указывая имена столбцов. - Вывод результата: Метод
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 |
+--------------------------------------------+------------+
Если у вас возникнут дополнительные вопросы или потребуется более детальное объяснение, не стесняйтесь обратиться!