我有许多Parquet格式的配置单元文件,其中包含 string
以及 double
柱。我可以把它们读入一个spark数据框 sparklyr
使用以下语法:
spark_read_parquet(sc, name = "name", path = "path", memory = FALSE)
然而,我有一个文件,我在那里所有的 string
值被转换为不可识别的列表,当收集到rDataframe并打印时,这些列表如下所示:
s_df <- spark_read_parquet(sc,
name = "s_df",
path = "hdfs://nameservice1/user/hive/warehouse/s_df",
memory = FALSE)
df <- collect(s_df)
head(df)
# A tibble: 11,081 x 13
provid hospital_name servcode servcode_desc codegroup claimid amountpaid
<list> <list> <list> <list> <list> <list> <dbl>
1 <raw [8… <raw [32]> <raw [5]> <raw [25]> <raw [29… <raw [1… 7.41
2 <raw [8… <raw [32]> <raw [5]> <raw [15]> <raw [22… <raw [1… 4.93
3 <raw [8… <raw [32]> <raw [5]> <raw [28]> <raw [22… <raw [1… 5.36
4 <raw [8… <raw [32]> <raw [5]> <raw [28]> <raw [30… <raw [1… 5.46
5 <raw [8… <raw [32]> <raw [5]> <raw [16]> <raw [30… <raw [1… 2.80
这个 hospital_name
对于前5行 df
应该读 METHODIST HOSPITAL OF SOUTHERN CALIFORNIA
,但结果却是这样:
head(df$hospital_name)
[[1]]
[1] 48 45 4e 52 59 20 4d 41 59 4f 20 4e 45 57 48 41 4c 4c 20 4d 45 4d 4f 52 49
[26] 41 4c 20 48 4f 53 50
[[2]]
[1] 48 45 4e 52 59 20 4d 41 59 4f 20 4e 45 57 48 41 4c 4c 20 4d 45 4d 4f 52 49
[26] 41 4c 20 48 4f 53 50
[[3]]
[1] 48 45 4e 52 59 20 4d 41 59 4f 20 4e 45 57 48 41 4c 4c 20 4d 45 4d 4f 52 49
[26] 41 4c 20 48 4f 53 50
[[4]]
[1] 48 45 4e 52 59 20 4d 41 59 4f 20 4e 45 57 48 41 4c 4c 20 4d 45 4d 4f 52 49
[26] 41 4c 20 48 4f 53 50
[[5]]
[1] 48 45 4e 52 59 20 4d 41 59 4f 20 4e 45 57 48 41 4c 4c 20 4d 45 4d 4f 52 49
[26] 41 4c 20 48 4f 53 50
我尝试了以下解决方案,但没有成功:
head(df %>% mutate(hospital_name = as.character(hospital_name)))
[1] "as.raw(c(0x48, 0x45, 0x4e, 0x52, 0x59, 0x20, 0x4d, 0x41, 0x59, 0x4f, 0x20, 0x4e, 0x45, 0x57, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x49, 0x41, 0x4c, 0x20, 0x48, 0x4f, 0x53, 0x50))"
[2] "as.raw(c(0x48, 0x45, 0x4e, 0x52, 0x59, 0x20, 0x4d, 0x41, 0x59, 0x4f, 0x20, 0x4e, 0x45, 0x57, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x49, 0x41, 0x4c, 0x20, 0x48, 0x4f, 0x53, 0x50))"
[3] "as.raw(c(0x48, 0x45, 0x4e, 0x52, 0x59, 0x20, 0x4d, 0x41, 0x59, 0x4f, 0x20, 0x4e, 0x45, 0x57, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x49, 0x41, 0x4c, 0x20, 0x48, 0x4f, 0x53, 0x50))"
[4] "as.raw(c(0x48, 0x45, 0x4e, 0x52, 0x59, 0x20, 0x4d, 0x41, 0x59, 0x4f, 0x20, 0x4e, 0x45, 0x57, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x49, 0x41, 0x4c, 0x20, 0x48, 0x4f, 0x53, 0x50))"
[5] "as.raw(c(0x48, 0x45, 0x4e, 0x52, 0x59, 0x20, 0x4d, 0x41, 0x59, 0x4f, 0x20, 0x4e, 0x45, 0x57, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x49, 0x41, 0x4c, 0x20, 0x48, 0x4f, 0x53, 0x50))"
我感谢任何帮助,能够解决这个问题或与任何建议,使我的要求更清楚。谢谢。
2条答案
按热度按时间z5btuh9x1#
要解决问题,请在读取Parquet文件之前为spark会话配置设置spark.sql.parquet.binaryaString属性:
备注:在我的例子中,一个Parquet文件是在impala中插入的结果,它包含“字符字段”,描述为“二进制”而不是“二进制utf8”。在这种情况下,另一种解决方案是在插入数据之前在impala shell中设置parquet\u annotate\u strings\u utf8:
cfh9epnr2#
reprex会很好(仅用于df),例如使用
dput(head(df))
把结果贴在这里。请尝试以下操作: