如何在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
相关产品推荐
相关产品推荐

