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

标签 r tidyr sparklyr

在以下示例中,我加载了一个 Parquet 文件,该文件包含 meta 中 map 对象的嵌套记录。 field 。 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>

收集数据时也存在问题。例如。,
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 字符串(这就是 Hive 返回此类数据的方式)。这会造成以下情况 tidyr甚至不适用于收集的数据。

有没有办法获取sparklyrtidyr 更好地合作我失踪了吗?如果没有,这是否计划用于 future sparklyr发展?

最佳答案

这并不是一个正确的解决方案,但是一种解决方法是使用 Hive 生成​​表或 View (例如, create view db_name.table_name as select ... )。处理爆炸操作。这为 sparklyr 提供平面数据工作。哪里sc是通过 sparklyr 的 Spark 连接一个可以用DBI::dbGetQuery(sc, "USE db_name")假设配置了 Hive,然后在列出带有 src_tbls(sc) 的表时会显示该 View 。 .一旦你执行 dat <- tbl(sc, "table_name")那么从那里航行应该更顺利。

因为这不是 sparklyr解决方案(但更多的是 Hive 解决方案)我不会接受这个答案。

关于r - 有没有办法用 sparklyr 处理嵌套数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276976/

相关文章:

r - 在 R 中推送和弹出列表的更好方法?

r - 从 group1、group2、overlap_count 创建重叠矩阵?

r - 如何使用 sparklyr 过滤部分匹配

apache-spark - 如何使用 spark-env.sh 文件设置 SPARK_LOCAL_DIRS 参数

r - Sparklyr 处理分类变量

r - 在 data.table 中使用 by 连接继承范围

html - 通过识别超链接导出R中的html表

regex - R:如何将字符串的一部分转换为变量名并在同一字符串中返回其值?

r - tidyverse 中所有可能的对

r - tidyr 传播后如何控制新变量的名称?