У меня много маленьких, индивидуальных .txt файлов. Для каждого из этих файлов у меня есть несколько строк, разделенных пробелом на 2 столбца: start_time и end_time (число с плавающей точкой).
Я хотел бы:
- загрузить все TXT-файлы
- для каждой строки вычисляют новый столбец, который содержит (end_time - start_time)
- для каждой строки, добавляют новый столбец с именем файла
- In В конце я хочу получить один dataFrame с этой схемой:
+------------+--------------+------------+------------+
| file_name | start_time | end_time | duration |
+------------+--------------+------------+------------+
Я знаю, что могу просто сделать al oop для каждого файла и каждой строки и добавить одну единственную строку в время для кадра данных, но я хотел бы знать, есть ли более быстрый способ сделать это.
Меня не интересует порядок, в котором все делается, но скорость конечного результата. Я вижу, что существующие функции, такие как textFile () и wholeTextFiles () , представлены в SparkContext, но я не мог понять, как их использовать, чтобы выполнить то, что я хочу.
Любые указания или рекомендации приветствуются!
(Извините за мой бедный Энгли sh)
Обновление:
Спасибо @ Шу за помощь, это последний код, который я использую для решения моей проблемы
from pyspark.sql.functions import split, reverse, input_file_name
original_schema = [StructField("Start", FloatType(), True),
StructField("End", FloatType(), True)]
data_structure = StructType(original_schema)
df = self.spark_session.read.\
csv(path=PATH_FILES+'\\*.txt', header=False, schema=data_structure, sep='\t').\
withColumn("Filename", reverse(split(input_file_name(), "/")).getItem(0) ).\
withColumn("duration", col("End") - col("Start"))
df.show(20, False)