sparklyr spark_read_parquet读取字符串字段作为列表

时间:2018-03-09 19:29:50

标签: r hive spark-dataframe parquet sparklyr

我有许多拼花格式的 Hive 文件,其中包含<powershell> function Disable-InternetExplorerESC { $AdminKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" $UserKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" Set-ItemProperty -Path $AdminKey -Name "IsInstalled" -Value 0 -Force Set-ItemProperty -Path $UserKey -Name "IsInstalled" -Value 0 -Force Remove-ItemProperty -Path $AdminKey -Name "IsInstalled" -Force Remove-ItemProperty -Path $UserKey -Name "IsInstalled" -Force } Disable-InternetExplorerESC </powershell> string列。我可以使用以下语法将大部分内容读入带有double的Spark数据框:

sparklyr

但是,我读了一个文件,其中所有spark_read_parquet(sc, name = "name", path = "path", memory = FALSE) 值都被转换为无法识别的列表,当收集到R数据框并打印时,这些列表看起来像这样:

string

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 的前5行的hospital_name应该是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

我感谢能够解决问题的任何帮助,或者提出任何建议,以使我的请求更加明确。感谢。

2 个答案:

答案 0 :(得分:1)

一个代表会很好(仅适用于df),例如使用dput(head(df))并将结果粘贴到此处。 请尝试以下方法:

df %>% mutate(hospital_name = unlist(lapply(hospital_name, function(e) rawToChar(e))))

答案 1 :(得分:0)

要在读取实木复合地板文件之前解决Spark Session配置的问题集spark.sql.parquet.binaryAsString属性:

sc$config$spark.sql.parquet.binaryAsString = TRUE

备注:在我的情况下,事实证明,因在IMPALA中插入而创建的拼花文件包含描述为“二进制”而不是“二进制UTF8”的“字符字段”。在这种情况下,另一种解决方案是在插入数据之前在impala-shell中设置PARQUET_ANNOTATE_STRINGS_UTF8

> set PARQUET_ANNOTATE_STRINGS_UTF8=1;
PARQUET_ANNOTATE_STRINGS_UTF8 set to 1