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

如何在arrow::to_duckdb转换时保留int64数据类型?

问题:通过arrow::to_duckdb()转换时保留int64数据类型

当使用arrow::to_duckdb()将R数据框或Parquet文件中的int64列转换为DuckDB表时,该列会被自动转为double类型,如何保留原始的int64数据类型?

示例代码

library(arrow, warn.conflicts = FALSE)
library(tidyverse, warn.conflicts = FALSE)
library(vroom, warn.conflicts = FALSE)

# 包含int64列的tibble
dd <- vroom("id\n9007199254740993\n", col_type = "I", delim = ",")
dd
#> # A tibble: 1 × 1
#>        id
#>   <int64>
#> 1    9e15

# 转换后被强制转为double类型
to_duckdb(dd)
#> # Source:   table<arrow_001> [1 x 1]
#> # Database: DuckDB 0.8.1 [root@Darwin 22.5.0:R 4.3.1/:memory:]
#>        id
#>     <dbl>
#> 1 9.01e15

解决方法

方法1:显式指定数据类型映射

可以通过定义Arrow Schema强制保留int64类型,再转换到DuckDB;或者转换后用duckdb_cast()将列转回对应类型:

# 方式1:先定义Arrow Schema,再转换
schema <- schema(id = int64())
dd_arrow <- arrow_table(dd, schema = schema)
to_duckdb(dd_arrow)

# 方式2:转换后强制转回DuckDB的BIGINT(对应int64)
to_duckdb(dd) %>% mutate(id = duckdb_cast(id, "BIGINT"))

方法2:针对Parquet文件的处理

如果是Parquet文件,先通过Arrow Dataset读取并绑定原始schema,再写入DuckDB:

# 定义与Parquet文件匹配的schema
parquet_schema <- schema(id = int64())
# 读取Parquet数据集
parquet_data <- open_dataset("你的parquet文件路径", schema = parquet_schema)
# 转换到DuckDB
to_duckdb(parquet_data)

原理说明

DuckDB的BIGINT类型与R的int64类型完全对应,问题源于Arrow默认会将R中无原生支持的int64映射为double以兼容基础类型系统,显式指定schema或类型转换可以跳过自动映射,直接保留原始整数类型。

内容的提问来源于stack exchange,提问作者davechilders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:12:45