【发布时间】:2020-08-01 19:44:24
【问题描述】:
我有很多小的、单独的 .txt 文件。对于这些文件中的每一个,我将多行用空格分隔为 2 列,start_time 和 end_time(一个浮点数)。
我想:
- 加载所有 .txt 文件
- 为每一行计算一个包含 (end_time - start_time) 的新列
- 为每一行添加一个带有文件名的新列
- 最后,我想获得一个具有此架构的数据帧:
+------------+--------------+------------+------------+
| file_name | start_time | end_time | duration |
+------------+--------------+------------+------------+
我知道我可以简单地为每个文件和每一行创建一个循环,并一次将一行添加到数据帧中,但我想知道是否有更快的方法来执行此操作。
我对事情完成的顺序不感兴趣,但最终结果的速度。
我看到 SparkContext 中提供了诸如 textFile() 和 wholeTextFiles() 等现有函数,但我不知道如何使用它们来做我想做的事情。
非常感谢任何方向或建议!
(对不起我的英语不好)
更新:
感谢@Shu 的帮助,这是我用来解决问题的最终代码
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)
【问题讨论】:
标签: python apache-spark pyspark hdfs rdd