2016-09-01 16 views
8

В следующем примере я загрузил файл паркета, который содержит вложенную запись объектов карты в поле meta. sparklyr, похоже, хорошо справляется с этим. Однако tidyr::unnest не переводит на SQL (или HQL - понятно - как LATERAL VIEW explode()) и, следовательно, неприменим. Есть ли способ отключить данные другим способом?Есть ли способ справиться с вложенными данными с помощью sparklyr?

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> 

Существует также проблема, когда данные собираются. НАПРИМЕР,

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] 

В приведенном выше, файл meta все еще содержит spark_jobj элементы вместо списков, data.frames или даже строки JSON (который, как улей будет возвращать такие данные). Это создает ситуацию, когда tidyr даже не работает с собранными данными.

Есть ли способ получить sparklyr, чтобы работать более красиво с tidyr, что мне не хватает? Если нет, запланировано ли это на будущее sparklyr?

ответ

1

я, наконец, у меня есть ответ на этот вопрос. См https://mitre.github.io/sparklyr.nested/ (источник: https://github.com/mitre/sparklyr.nested)

tf %>% 
    sdf_unnest(meta) 

Это будет вести себя для фреймов данных Спарка аналогично тому, как ведет себя tidyr::unnest для местных кадров данных. Также реализованы операции вложенных выборок и взрывов.

1

Это не совсем правильное решение, однако одна работа заключается в том, чтобы использовать Hive для создания таблицы или вида (например, create view db_name.table_name as select ...). который обрабатывает операцию взрыва. Это служит для плоских данных для sparklyr для работы. Где sc - искровое соединение через sparklyr, можно использовать DBI::dbGetQuery(sc, "USE db_name"), предполагая, что Hive настроен, и представление будет отображаться при перечислении таблиц с src_tbls(sc). Как только вы выполните dat <- tbl(sc, "table_name"), тогда оттуда следует плавать.

Поскольку это не решение sparklyr (но скорее решение для улья), я не буду принимать этот ответ.

1

Вот еще один вариант, который не зависит от улья (по крайней мере, как непосредственно, LATERAL VIEW explode() - это улей).

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

Я не собираюсь принять этот ответ либо, так как я все еще хотел бы увидеть что-то вроде:

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

но это потребует поддержки вложенных операторов выбора. Возможно, что-то вроде синтаксиса tidyr::unnest будет делать трюк:

tf %>% 
    sdf_mutate(a=ft_explode(meta)) %>% 
    unnest(a) 
Смежные вопросы