2016-09-01 13 views
8

W poniższym przykładzie załadowałem plik parkietu zawierający zagnieżdżony rekord obiektów mapy w polu meta. sparklyr wydaje się robić dobrą robotę radzenia sobie z nimi. Jednak tidyr::unnest nie tłumaczy się na SQL (lub HQL - co zrozumiałe - jak na przykład LATERAL VIEW explode()), a zatem nie nadaje się do użytku. Czy istnieje sposób na anulowanie danych w inny sposób?Czy istnieje sposób radzenia sobie z zagnieżdżonymi danymi za pomocą iskrzenia?

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> 

Występuje również problem podczas gromadzenia danych. Np

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] 

W powyższym pliku meta nadal zawiera spark_jobj elementy zamiast list, data.frames lub nawet ciągów JSON (co jest jak Hive wróci takich danych). Stwarza to sytuację, w której tidyr nawet nie działa na zebranych danych.

Czy istnieje sposób, aby uzyskać, aby pracować ładniej z tidyr, której mi brakuje? Jeśli nie, czy jest to planowane na przyszłość sparklyr rozwój?

Odpowiedz

1

To nie jest właściwe rozwiązanie, ale jednym z zadań jest użycie Hive do wygenerowania tabeli lub widoku (np. create view db_name.table_name as select ...). który obsługuje operację eksplodowania. Służy to do przesyłania płaskich danych do pracy w trybie sparklyr. Tam gdzie sc jest połączeniem iskrowym poprzez sparklyr można użyć DBI::dbGetQuery(sc, "USE db_name") przy założeniu, że Hive jest skonfigurowany, a widok wyświetli się przy listowaniu tabel z src_tbls(sc). Gdy wykonasz dat <- tbl(sc, "table_name"), powinno to być płynniejsze.

Ponieważ nie jest to rozwiązanie sparklyr (ale bardziej rozwiązanie Hive) nie zaakceptuję tej odpowiedzi.

1

Oto kolejna opcja, która nie zależy od Hive (przynajmniej tak bezpośrednio, LATERAL VIEW explode() jest ulem).

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"))) 

ja nie zamierzam akceptować tę odpowiedź albo ponieważ chciałbym jeszcze chciałbym zobaczyć coś takiego:

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

ale to wymagałoby wsparcia dla zagnieżdżonych SELECT. Być może coś w składni tidyr::unnest by rade:

tf %>% 
    sdf_mutate(a=ft_explode(meta)) %>% 
    unnest(a) 
Powiązane problemy