在s3://my-bucket/events/date=X/
我有一个镶嵌数据集存储在多个零件文件中:
part000.snappy.parquet
part001.snappy.parquet
part002.snappy.parquet
数据集中的事件具有timestamp
列,ISO 8601中的字符串。数据集中的事件完全未排序。
使用spark,我想对数据集进行排序并将其存储在S3中,以便:
partXXX.snappy.parquet
内,事件按时间戳排序详细说明: - 每个零件文件有200MB - 1GB - 最终保存的文件可以包含任意数量的事件,只要我能以某种方式控制它们的大小。我想保留大小小于1GB的零件文件。
在Spark中这样做很容易吗?怎么可以实现这个?/
答案 0 :(得分:0)
以下工作:
target_path = "s3://..."
events = spark.read.parquet("s3://my-bucket/events/date=X/")
events = events.sort("timestamp", ascending=True)
num_files = ceil(float(events.count()) / EVENTS_PER_FILE)
events.coalesce(num_files).write.parquet(
target_path,
mode="overwrite") # note: overwrite deletes old files