使用Spark对镶木地板数据集进行排序,并将排序后的结果存储为S3中的多个文件

时间:2017-08-30 09:47:53

标签: sorting apache-spark amazon-s3

s3://my-bucket/events/date=X/我有一个镶嵌数据集存储在多个零件文件中:

  • part000.snappy.parquet
  • part001.snappy.parquet
  • part002.snappy.parquet
  • ...

数据集中的事件具有timestamp列,ISO 8601中的字符串。数据集中的事件完全未排序。

使用spark,我想对数据集进行排序并将其存储在S3中,以便:

  • 在每个partXXX.snappy.parquet内,事件按时间戳排序
  • 具有较低XXX的部分文件具有较低的时间戳,即时间戳为 part000中的事件是< =部分001中的事件的时间戳< = 部分002中的事件时间戳,......

详细说明:   - 每个零件文件有200MB - 1GB   - 最终保存的文件可以包含任意数量的事件,只要我能以某种方式控制它们的大小。我想保留大小小于1GB的零件文件。

在Spark中这样做很容易吗?怎么可以实现这个?/

1 个答案:

答案 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