2015-05-20 14 views
6

Tôi đang vật lộn với bước mà tôi muốn viết từng phân vùng RDD để phân tách tệp lát gỗ bằng thư mục riêng của nó. Ví dụ sẽ là:Viết phân vùng RDD vào các tệp gỗ riêng lẻ trong thư mục riêng của nó

<root> 
     <entity=entity1> 
      <year=2015> 
       <week=45> 
        data_file.parquet 

Advantage của định dạng này là tôi có thể sử dụng trực tiếp trong SparkSQL như cột và tôi sẽ không phải lặp lại dữ liệu này trong tập tin thực tế. Đây sẽ là cách tốt để truy cập vào phân vùng cụ thể mà không lưu trữ siêu dữ liệu phân vùng riêng biệt ở một nơi khác.

Như bước trước, tôi có tất cả dữ liệu được tải từ số lượng lớn tệp gzip và được phân đoạn dựa trên khóa ở trên.

Cách có thể là nhận từng phân vùng dưới dạng RDD riêng biệt và sau đó viết nó mặc dù tôi không thể tìm ra cách nào tốt để thực hiện nó.

Mọi trợ giúp sẽ được đánh giá cao. Bằng cách này tôi mới vào ngăn xếp này.

Trả lời

2

Tôi nghĩ rằng có thể bằng cách gọi foreachPartition(f: Iterator[T] => Unit) trên RDD bạn muốn lưu.

Trong các chức năng mà bạn cung cấp vào foreachPartition:

  1. Chuẩn bị con đường hdfs://localhost:9000/parquet_data/year=x/week=y
  2. một ParquetWriter
  3. xả Iterator bằng cách chèn mỗi dòng vào recordWriter.
  4. dọn dẹp
+0

Cảm ơn bạn đã trả lời. Tôi hiểu khái niệm câu trả lời của bạn và cố gắng thực hiện nó nhưng không thể tìm cách để xây dựng nhà văn ParquetRecord? Bất kỳ mẫu mã nào trong Scala sẽ cực kỳ hữu ích. –

+0

@RajeevPrasad, tôi đã chỉnh sửa câu trả lời bằng ví dụ về người viết bìa gỗ, vui lòng kiểm tra mã src có liên quan để xem cách hoạt động :) –

+0

Cảm ơn sự giúp đỡ của bạn. Điều này hoạt động tốt. Bạn có biết hiệu suất của việc thực hiện này so với việc viết trực tiếp bằng cách sử dụng saveAsParquetFile hay không. –

42

Tôi không nghĩ rằng câu trả lời được chấp nhận một cách thích hợp trả lời câu hỏi.

Hãy thử một cái gì đó như thế này:

df.write.partitionBy("year", "month", "day").parquet("/path/to/output") 

Và bạn sẽ nhận được cấu trúc thư mục phân vùng.

+0

Đồng ý, đây phải là câu trả lời được chấp nhận. –

+0

Có, câu trả lời này đơn giản và tương lai hơn. – Sim

Các vấn đề liên quan