Python 年月日分割后的火花df分割
S3承载一个非常大的压缩文件(20gb压缩->200gb未压缩)。 我想读入这个文件(不幸的是在单核上解压),转换一些sql列,然后以Python 年月日分割后的火花df分割,python,dataframe,apache-spark,Python,Dataframe,Apache Spark,S3承载一个非常大的压缩文件(20gb压缩->200gb未压缩)。 我想读入这个文件(不幸的是在单核上解压),转换一些sql列,然后以S3\u path/year=2020/month=01/day=01/[files 1-200]格式输出到S3 整个文件将包含来自同一日期的数据。这让我相信,我不应该使用partitionBy('year','month','day')而是应该将“year={year}/month={month}/day={day}/”附加到s3路径,因为目前spark一次只向
S3\u path/year=2020/month=01/day=01/[files 1-200]格式输出到S3
整个文件将包含来自同一日期的数据。这让我相信,我不应该使用partitionBy('year','month','day')
而是应该将“year={year}/month={month}/day={day}/”
附加到s3路径,因为目前spark一次只向s3写入一个文件(每个文件大小为1gb)。我的想法正确吗
以下是我目前正在做的事情:
df = df\
.withColumn('year', lit(datetime_object.year))\
.withColumn('month', lit(datetime_object.month))\
.withColumn('day', lit(datetime_object.day))
df\
.write\
.partitionBy('year','month','day')\
.parquet(s3_dest_path, mode='overwrite')
我在想:
df = spark.read.format('json')\
.load(s3_file, schema=StructType.fromJson(my_schema))\
.repartition(200)
# currently takes a long time decompressing the 20gb s3_file.json.gz
# transform
df.write\
.parquet(s3_dest_path + 'year={}/month={}/day={}/'.format(year,month,day))
您可能遇到了这样的问题:spark首先将数据写入某个临时目录,然后才将其提交到最终位置。在HDFS中,这是通过重命名完成的。但是S3不支持重命名,而是完全复制数据(仅使用一个执行器)。有关此主题的更多信息,请参见本文示例:
常见的解决方法是写入hdfs,然后使用distcp将分布式文件从hdfs复制到s3您可能会遇到这样的问题:spark首先将数据写入某个临时目录,然后才将其提交到最终位置。在HDFS中,这是通过重命名完成的。但是S3不支持重命名,而是完全复制数据(仅使用一个执行器)。有关此主题的更多信息,请参见本文示例:
常见的解决方法是向hdfs写入数据,然后使用distcp将分发的数据从hdfs复制到s3我看不出这样做有什么害处。我看不出这样做有什么害处。我不断听到人们说s3怎么可能。现在是2020年,这看起来很奇怪。我完全同意。我的知识来自2018年。。。因此,如果从那以后发生了什么事情,我很高兴得到更新。我不断听到人们说S3是如何实现的。现在是2020年,这看起来很奇怪。我完全同意。我的知识来自2018年。。。因此,如果从那以后发生了什么事情,我很高兴得到最新消息