如何在Arrow包中结合dplyr处理非UTF-8字符?
解决Parquet读取时的UTF-8无效错误
不用修改原CSV文件,核心是在读取CSV阶段就指定正确的字符编码,让Arrow正确解析特殊字符后再写入Parquet,后续操作就能正常执行。
具体修正方案
1. 重新读取CSV并指定编码
原代码读取CSV时未指定编码,Arrow默认用UTF-8解析非UTF-8文件,导致é、ő、ú这类特殊字符被解析成无效字节,写入Parquet后触发报错。需要根据CSV实际编码设置encoding参数(比如匈牙利语常用的ISO-8859-2,Windows环境可尝试Windows-1250):
library(arrow) # 清理之前生成的错误Parquet文件(可选,避免混淆) unlink("tickets_22_parts", recursive = TRUE) dir.create("tickets_22_parts") # 读取CSV时指定正确编码 tickets_arrow <- open_dataset( "tickets_2022.csv", format = "csv", encoding = "ISO-8859-2" # 根据实际编码替换,比如Windows-1250 ) # 重新写入标准UTF-8编码的Parquet文件 write_dataset(tickets_arrow, "tickets_22_parts", format = "parquet") # 读取Parquet并执行数据操作 arrow_df <- open_dataset( "tickets_22_parts", schema = schema( date = date32(), channel = string(), station = string() ) ) table <- arrow_df %>% group_by(station) %>% summarize(passengers = sum(trips)) %>% collect()
2. 确认CSV的正确编码
如果不确定编码,可先用readLines测试:
# 读取前5行测试编码是否正确 test_lines <- readLines("tickets_2022.csv", n = 5, encoding = "ISO-8859-2") print(test_lines) # 若特殊字符显示正常,说明编码正确;否则换Windows-1250等编码尝试
报错原因说明
原代码读取CSV时默认用UTF-8解析非UTF-8编码的文件,导致特殊字符被解析为无效的UTF-8字节,写入Parquet后,后续读取时就触发了"Invalid UTF8 payload"错误。只要在读取源CSV时指定正确编码,Arrow会自动将其转换为标准UTF-8存储到Parquet中,后续数据操作即可正常进行。
内容的提问来源于stack exchange,提问作者Rudolf Nyitray
相关产品推荐
相关产品推荐

