嗨,我有一个深度嵌套的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而不是列表(“”)?
答案 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()
这似乎与您提供的架构相匹配。但是,当我使用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))
会做我认为的技巧(未经测试)。