2016-09-01 17 views
8

Trong ví dụ sau, tôi đã tải một tệp lát gỗ có chứa một bản ghi lồng nhau của các đối tượng bản đồ trong trường meta. sparklyr dường như làm một công việc tốt đẹp để giải quyết những vấn đề này. Tuy nhiên tidyr::unnest không dịch sang SQL (hoặc HQL - dễ hiểu - như LATERAL VIEW explode()) và do đó không thể sử dụng được. Có cách nào để dữ liệu không cần thiết theo cách khác không?Có cách nào để xử lý dữ liệu lồng nhau với sparklyr không?

tfl <- head(tf) 
tfl 
Source: query [?? x 10] 
Database: spark connection master=yarn-client app=sparklyr local=FALSE 

          trkKey    meta  sources startTime 
          <chr>   <list>  <list> <list> 
1 3juPe-k0yiMcANNMa_YiAJfJyU7WCQ3Q <S3: spark_jobj> <list [24]> <dbl [1]> 
2 3juPe-k0yiAJX3ocJj1fVqru-e0syjvQ <S3: spark_jobj> <list [1]> <dbl [1]> 
3 3juPe-k0yisY7UY_ufUPUo5mE1xGfmNw <S3: spark_jobj> <list [7]> <dbl [1]> 
4 3juPe-k0yikXT5FhqNj87IwBw1Oy-6cw <S3: spark_jobj> <list [24]> <dbl [1]> 
5 3juPe-k0yi4MMU63FEWYTNKxvDpYwsRw <S3: spark_jobj> <list [7]> <dbl [1]> 
6 3juPe-k0yiFBz2uPbOQqKibCFwn7Fmlw <S3: spark_jobj> <list [19]> <dbl [1]> 
# ... with 6 more variables: endTime <list>, durationInMinutes <dbl>, 
# numPoints <int>, maxSpeed <dbl>, maxAltitude <dbl>, primaryKey <chr> 

Ngoài ra còn có vấn đề khi thu thập dữ liệu. Ví dụ:

tfl <- head(tf) %>% collect() 
tfl 
# A tibble: 6 × 10 
          trkKey    meta  sources startTime 
          <chr>   <list>  <list> <list> 
1 3juPe-k0yiMcANNMa_YiAJfJyU7WCQ3Q <S3: spark_jobj> <list [24]> <dbl [1]> 
2 3juPe-k0yiAJX3ocJj1fVqru-e0syjvQ <S3: spark_jobj> <list [1]> <dbl [1]> 
3 3juPe-k0yisY7UY_ufUPUo5mE1xGfmNw <S3: spark_jobj> <list [7]> <dbl [1]> 
4 3juPe-k0yikXT5FhqNj87IwBw1Oy-6cw <S3: spark_jobj> <list [24]> <dbl [1]> 
5 3juPe-k0yi4MMU63FEWYTNKxvDpYwsRw <S3: spark_jobj> <list [7]> <dbl [1]> 
6 3juPe-k0yiFBz2uPbOQqKibCFwn7Fmlw <S3: spark_jobj> <list [19]> <dbl [1]> 
# ... with 6 more variables: endTime <list>, durationInMinutes <dbl>, 
# numPoints <int>, maxSpeed <dbl>, maxAltitude <dbl>, primaryKey <chr> 

tfl %>% unnest(meta) 
Error: Each column must either be a list of vectors or a list of data frames [meta] 

Ở phía trên, các tập tin meta vẫn chứa spark_jobj yếu tố thay vì danh sách, data.frames, hoặc thậm chí chuỗi JSON (đó là cách Hive sẽ trả lại dữ liệu như vậy). Điều này tạo ra một tình huống mà tại đó tidyr thậm chí không hoạt động trên dữ liệu đã thu thập.

Có cách nào để có được sparklyr để hoạt động độc đáo hơn với tidyr mà tôi bị thiếu không? Nếu không, kế hoạch này có được triển khai cho tương lai phát triển sparklyr không?

Trả lời

1

Đây không phải là giải pháp thích hợp, tuy nhiên, một cách giải quyết là sử dụng Hive để tạo bảng hoặc chế độ xem (ví dụ: create view db_name.table_name as select ...). xử lý hoạt động phát nổ. Điều này sẽ phục vụ dữ liệu phẳng cho sparklyr để hoạt động. Trong trường hợp sc là kết nối tia lửa qua sparklyr, người dùng có thể sử dụng DBI::dbGetQuery(sc, "USE db_name") giả định Hive được định cấu hình và chế độ xem sẽ hiển thị khi liệt kê các bảng có src_tbls(sc). Khi bạn thực hiện dat <- tbl(sc, "table_name") thì nó sẽ được chuyển mượt mà hơn từ đó.

Vì đây không phải là giải pháp sparklyr (nhưng thêm giải pháp Hive), tôi sẽ không chấp nhận câu trả lời này.

1

Dưới đây là một tùy chọn khác không phụ thuộc vào Hive (ít nhất là trực tiếp, LATERAL VIEW explode() là một điều hive).

tf %>% 
    sdf_mutate(ft_sql_transformer(
    b, paste0("SELECT trkKey, a.fld1 as fld1, a.fld2 as fld2", 
       "FROM __THIS__ LATERAL VIEW explode(__THIS__.meta) x AS a"))) 

tôi sẽ không chấp nhận câu trả lời này hoặc kể từ khi tôi vẫn muốn nhìn thấy cái gì đó như:

tf %>% 
    sdf_mutate(a=ft_explode(meta)) 

nhưng điều đó sẽ yêu cầu hỗ trợ cho câu SELECT lồng nhau. Có lẽ một cái gì đó giống như cú pháp tidyr::unnest sẽ thực hiện thủ thuật:

tf %>% 
    sdf_mutate(a=ft_explode(meta)) %>% 
    unnest(a) 
Các vấn đề liên quan