嗨,我有一个嵌套很深的json文件。我使用sparklyr读取这个json文件,并将其命名为"data“对象。
首先,我将展示数据结构:
# 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("")?
发布于 2018-03-21 23:38:34
我无法重现这段视频。我用过
[{"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在spark land中解决此问题,也可以通过多种方式在本地解决此问题。例如,使用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))会做我认为的把戏(未经测试)。
https://stackoverflow.com/questions/48869472
复制相似问题