有没有办法用sparklyr处理嵌套数据?

Mat*_*ock 9 r tidyr sparklyr

在下面的示例中,我加载了一个镶木地板文件,其中包含该meta字段中地图对象的嵌套记录.sparklyr似乎在处理这些方面做得很好.但是tidyr::unnest,不会转换为SQL(或HQL - 可以理解 - 就像LATERAL VIEW explode()),因此无法使用.有没有办法以其他方式取消数据?

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>
Run Code Online (Sandbox Code Playgroud)

收集数据时也存在问题.例如,

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]
Run Code Online (Sandbox Code Playgroud)

在上面,meta文件仍然包含spark_jobj元素而不是列表,data.frames,甚至JSON字符串(这是Hive将返回此类数据的方式).这会产生tidyr甚至不能对收集的数据起作用的情况.

有没有办法让我sparklyr更好地工作tidyr,我失踪了?如果没有,这是否计划用于未来sparklyr发展?

Mat*_*ock 2

我终于对此有了答案。请参阅https://mitre.github.io/sparklyr.nested/(来源: https: //github.com/mitre/sparklyr.nested

tf %>% 
  sdf_unnest(meta)
Run Code Online (Sandbox Code Playgroud)

Spark 数据帧的行为与tidyr::unnest本地数据帧的行为类似。还实现了嵌套选择和分解操作。

更新:

正如@cem-bilge注释explode可以在内部使用mutate。这在数组很简单(字符或数字)的情况下很有效,但在其他情况下则不太有效。

iris2 <- copy_to(sc, iris, name="iris")
iris_nst <- iris2 %>%
  sdf_nest(Sepal_Length, Sepal_Width, Petal.Length, Petal.Width, .key="data") %>%
  group_by(Species) %>%
  summarize(data=collect_list(data))
Run Code Online (Sandbox Code Playgroud)

然后

iris_nst %>% mutate(data = explode(data)) %>% sdf_schema_viewer()
Run Code Online (Sandbox Code Playgroud)

产生

在此输入图像描述

字段仍然嵌套(尽管已分解),而sdf_unnest产量

iris_nst %>% sdf_unnest(data) %>% sdf_schema_viewer()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述