Sparklyr如何查看变量

时间:2018-02-19 15:40:17

标签: r sparklyr

嗨,我有一个深度嵌套的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]>

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

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

数据显示

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

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

1 个答案:

答案 0 :(得分:0)

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

[{"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()

sdf_schema_viewer output

这似乎与您提供的架构相匹配。但是,当我使用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))

会做我认为的技巧(未经测试)。