You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:42:46