【问题标题】:Sparklyr how to view variablesSparklyr 如何查看变量
【发布时间】:2018-02-19 15:40:17
【问题描述】:

您好,我有一个深度嵌套的 json 文件。我使用 sparklyr 读取这个 json 文件并将这个“数据”对象命名为。

首先我将展示数据结构的样子:

# Database: spark_connection
data
    -a : string
    -b : string
    -c : (struct)
       c1 : string
       c2 : (struct)
          c21: string
          c22: string

类似的东西。因此,如果我使用以下方法提取“a”:

data %>% sdf_select(a)

我可以查看里面的数据,比如:

   # Database: spark_connection
   a
   <chr>
1  Hello world
2  Stack overflow is epic

现在的问题是当我使用 sdf_select() 更深的结构时,即

data %>% sdf_select(c.c2.c22)

查看里面的数据,我明白了

  # Database: spark_connection
  c22
  <list>
1 <list [1]>
2 <list [1]>
3 <list [1]>
4 <lgl [1]>

所以如果我收集数据以便 spark 数据帧变成 R 数据帧并使用命令查看数据

View(collect(data %>% sdf_select(c.c2.c22)))

数据显示

1 list("Good")
2 list("Bad")
3 NA

如何将上面每个列表中的每个条目转换为数据框表,以便它只显示 Good、Bad、NA 而不是 list("")?

【问题讨论】:

标签: r sparklyr


【解决方案1】:

我无法重现这一点。我用过

[{"a":"jkl","b":"mno","c":{"c1":"ghi","c2":{"c21":"abc","c22":"def"}}}]

写信给test.json,然后是

spk_df <- spark_read_json(sc, "tmp", "file:///path/to/test.json")
spk_df %>% sdf_schema_viewer()

这似乎与您提供的架构相匹配。但是,当我使用 sparklyr.nested::sdf_select() 时,我得到了不同的结果。

spk_df %>% sdf_select(c.c2.c22)
# # Source:   table<sparklyr_tmp_7431373dca00> [?? x 1]
# # Database: spark_connection
#   c22  
#   <chr>
# 1 def

其中c22 是一个字符列。

我的猜测是,在您的真实数据中,其中一个级别实际上是一个结构数组。如果是这种情况,那么索引到数组会强制列表换行(否则需要删除数据)。您可以使用sdf_explode 在火花地带解决此问题,也可以通过多种方式在本地解决此问题。例如,使用 purrr 你会做这样的事情:

df <- collect(spk_df)
df %>% mutate(c22=purrr::map(c22, ~unlist))

您可能需要编写一个包装 unlist 的函数来处理不同行中的不同数据类型(NA 值是合乎逻辑的)。

unlist_and_cast <- function(x) {
  as.charater(unlist(x))
}

df %>% mutate(c22=purrr::map(c22, ~unlist_and_cast))

会做我认为的伎俩(未经测试)。

【讨论】:

  • 已经有一段时间了,我想出了一条出路。所以基本上我复制列,命名它。删除旧列并将其重命名为原始名称。数据 %>% sdf_select(c.c2.c22) %>% sdf_separate_column(column = "c22", into= "c221") %>% select(-c22) %>% rename(c22 = c221)
  • 是的,基本上采用使其更宽的方法(separate_column)而不是使其更长的方法(爆炸)。在您的情况下,一切似乎都是 1 元素列表,两者是等价的。如果您的 c22 列有任何列表长度大于 1 的行,您就会开始注意到差异。
  • 嗨,马特,我刚刚将 dplyr、sparklyR 更新到了新版本。当我选择数据 %>% sdf_select(c.c2.c22) 时,显示的列名将变为 c2 而不是 c22 所以列的名称是父级的嵌套名称。你能看看发生了什么吗?
  • 这看起来像一个错误 - 在此处跟踪 github.com/mitre/sparklyr.nested/issues/21
  • sparklyr.nested。选择默认列名的逻辑在编写时没有考虑到多层深度嵌套
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2018-03-22
  • 2013-08-24
相关资源
最近更新 更多