Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在pySpark中修改输出数据文件名?_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 是否可以在pySpark中修改输出数据文件名?

Python 是否可以在pySpark中修改输出数据文件名?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,简化案例 假设我在目录data\u目录中有5个输入文件: data_2020-01-01.txt, data_2020-01-02.txt, data_2020-01-03.txt, data_2020-01-04.txt, data_2020-01-05.txt 我将它们全部读给pySpark RDD,并对它们执行一些不进行任何洗牌的操作 spark = SparkSession.builder.appName("Clean Data").getOrCreate() sp

简化案例

假设我在目录
data\u目录中有5个输入文件

data_2020-01-01.txt,
data_2020-01-02.txt,
data_2020-01-03.txt,
data_2020-01-04.txt,
data_2020-01-05.txt
我将它们全部读给pySpark RDD,并对它们执行一些不进行任何洗牌的操作

spark = SparkSession.builder.appName("Clean Data").getOrCreate()
sparkContext = spark.sparkContext

input_rdd = sparkContext.textFile("data_directory/*")
result = input_rdd.mapPartitions(lambda x: remove_corrupted_rows(x))
现在我想保存数据:

result.saveAsTextFile(
    "results",
    compressionCodecClass="org.apache.hadoop.io.compress.GzipCodec",
)
我得到了5个文件,每个文件都包含名称“part”。因此,我丢失了有关输出文件来自哪个输入文件的信息:

._SUCCESS.crc
.part-00000.gz.crc
.part-00001.gz.crc
.part-00002.gz.crc
.part-00003.gz.crc
.part-00004.gz.crc
_SUCCESS
part-00000.gz
part-00001.gz
part-00002.gz
part-00003.gz
part-00004.gz
在这种情况下,是否保留输入文件名或引入我自己的命名模式?

预期结果:

._SUCCESS.crc
.data_2020-01-01.gz.crc
.data_2020-01-02.gz.crc
.data_2020-01-03.gz.crc
.data_2020-01-04.gz.crc
.data_2020-01-05.crc
_SUCCESS
data_2020-01-01.gz
data_2020-01-02.gz
data_2020-01-03.gz
data_2020-01-04.gz
data_2020-01-05.gz

您可以使用
pyspark.sql.functions.input_file_name()
(此处的文档),然后根据创建的列对数据帧进行分区

这样,5个输入文件应该为您提供一个包含5个不同值的分类列,并对其进行分区,从而将您的输出分成5个部分

或者,如果您希望有一个完整的命名模式,则在功能上将
输入文件\u name()
列上的数据帧拆分(此处为5个数据帧),重新分区(例如,使用
合并(1)
)将其拆分为1),然后使用自定义逻辑保存(例如,dict映射或从列中提取文件名并解析为
DataFrameWriter.csv()
as name)


注意:当更改为1个分区时,请确保所有数据都存储在内存中!

您的部件文件不保证包含这些日期(也不保证有相同数量的输出文件)。如果要保留这些信息,可以使用命名目录分区