2016-10-06 16 views
6

Tôi đang đọc dữ liệu gỗ và tôi thấy rằng nó được liệt kê tất cả các thư mục bên tài xếLàm thế nào để kích hoạt tính năng tỉa phân vùng trong spark

Listing s3://xxxx/defloc/warehouse/products_parquet_151/month=2016-01 on driver 
Listing s3://xxxx/defloc/warehouse/products_parquet_151/month=2014-12 on driver 

tôi đã xác định tháng = 2014-12 trong mệnh đề where của tôi. Tôi đã thử sử dụng API sql và API khung dữ liệu, và có vẻ như cả hai đều không cắt phân đoạn.

Sử dụng Dataframe API

df.filter("month='2014-12'").show() 

Sử dụng Spark SQL

sqlContext.sql("select name, price from products_parquet_151 where month = '2014-12'") 

Tôi đã thử trên trên các phiên bản 1.5.1, 1.6.1 và 2.0.0

+0

Tôi đã gặp sự cố tương tự và tôi đã giải quyết nó bằng \ '\' - cố gắng sử dụng một cái gì đó như 'sqlContext.sql (" chọn tên, giá từ products_parquet_151 trong đó \ 'month \' = '2014-12' ")' – VladoDemcak

+0

không giải quyết được. Vấn đề là tia lửa phát ra một cuộc gọi danh mục mà không cần đẩy bộ lọc xuống lớp HDFS thấp hơn –

Trả lời

1

Spark cần nạp phân vùng metdata đầu tiên trong trình điều khiển để biết phân vùng có tồn tại hay không. Spark sẽ truy vấn thư mục để tìm các phân vùng hiện có để biết nó có thể cắt phân vùng hay không trong quá trình quét dữ liệu.

Tôi đã thử nghiệm điều này trên Spark 2.0 và bạn có thể thấy trong thông báo tường trình.

16/10/14 17:23:37 TRACE ListingFileCatalog: Listing s3a://mybucket/reddit_year on driver 
16/10/14 17:23:37 TRACE ListingFileCatalog: Listing s3a://mybucket/reddit_year/year=2007 on driver 

Điều này không có nghĩa là chúng tôi đang quét các tệp trong từng phân đoạn, nhưng Spark sẽ lưu trữ vị trí của phân đoạn cho các truy vấn trong tương lai trên bảng.

Bạn có thể xem các bản ghi mà nó thực sự là đi qua trong các bộ lọc phân vùng để prune dữ liệu:

16/10/14 17:23:48 TRACE ListingFileCatalog: Partition spec: PartitionSpec(StructType(StructField(year,IntegerType,true)),ArrayBuffer(PartitionDirectory([2012],s3a://mybucket/reddit_year/year=2012), PartitionDirectory([2010],s3a://mybucket/reddit_year/year=2010), ...PartitionDirectory([2015],s3a://mybucket/reddit_year/year=2015), PartitionDirectory([2011],s3a://mybucket/reddit_year/year=2011))) 
16/10/14 17:23:48 INFO ListingFileCatalog: Selected 1 partitions out of 9, pruned 88.88888888888889% partitions. 

Bạn có thể thấy điều này trong kế hoạch hợp lý nếu bạn chạy một explain(True) trên truy vấn của bạn: spark.sql("select created_utc, score, name from reddit where year = '2014'").explain(True)

này sẽ cho bạn kế hoạch và bạn có thể thấy rằng nó được lọc ở dưới cùng của kế hoạch:

+- *BatchedScan parquet [created_utc#58,name#65,score#69L,year#74] Format: ParquetFormat, InputPaths: s3a://mybucket/reddit_year, PartitionFilters: [isnotnull(year#74), (cast(year#74 as double) = 2014.0)], PushedFilters: [], ReadSchema: struct<created_utc:string,name:string,score:bigint> 
+0

Nói chung điều này là không cần thiết. Ví dụ, phân vùng JSON có thể được nạp mà không cần quét các phân vùng khác. –

+0

Đây không phải là câu trả lời thỏa mãn nhưng vì tiền thưởng duy nhất là của bạn. –

+0

@LostInOverflow Câu hỏi ban đầu liên quan đến sàn gỗ, đó là một định dạng nhị phân hỗ trợ phân vùng cắt tỉa.Tôi đã kiểm tra nhanh với các tệp json được phân đoạn và có vẻ như nó không vượt qua bất kỳ bộ lọc nào trong quá trình quét. Đối với các định dạng không phải nhị phân, có vẻ như yêu cầu tính năng này sẽ cần cho trường hợp sử dụng cụ thể của bạn. Hy vọng rằng sẽ giúp. – MrChristine

1

Spark có cơ hội cải thiện khả năng cắt phân vùng khi đi qua Hive; xem SPARK-17179.

Nếu bạn đang đi trực tiếp đến cửa hàng đối tượng, thì vấn đề là các hoạt động thư mục đệ quy đối với các cửa hàng đối tượng là những kẻ giết người thực hiện thực. Các đồng nghiệp của tôi và tôi đã làm việc trong ứng dụng S3A ở đó HADOOP-11694 — và bây giờ cần theo dõi nó với những thay đổi để Spark áp dụng các cuộc gọi API cụ thể mà chúng tôi có thể khắc phục được. Mặc dù vậy, chúng tôi cần đảm bảo rằng chúng tôi đang làm việc với các bộ dữ liệu thực với bố cục từ thực, vì vậy đừng tối ưu hóa cho các ví dụ/tiêu chuẩn cụ thể.

Hiện tại, mọi người nên chọn bố cục phân vùng có cây thư mục nông.

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