我使用r来处理大型数据集(最大的Dataframe30.000.000 x 120)。这些文件作为Parquet文件存储在azuredatalake存储中,我们需要每天查询这些文件并在本地sql数据库中还原它们。Parquet文件可以读取而无需将数据加载到内存中,这很方便。但是,从parquet文件创建sql表更具挑战性,因为我不希望将数据加载到内存中。
这是我使用的代码。不幸的是,这不是一个完美的reprex,因为sql数据库需要存在才能工作。
# load packages
library(tidyverse)
library(arrow)
library(sparklyr)
library(DBI)
# Create test data
test <- data.frame(matrix(rnorm(20), nrow=10))
# Save as parquet file
write_parquet(test2, tempfile(fileext = ".parquet"))
# Load main table
sc <- spark_connect(master = "local", spark_home = spark_home_dir())
test <- spark_read_parquet(sc, name = "test_main", path = "/tmp/RtmpeJBgyB/file2b5f4764e153.parquet", memory = FALSE, overwrite = TRUE)
# Save into SQL table
DBI::dbWriteTable(conn = connection,
name = DBI::Id(schema = "schema", table = "table"),
value = test)
是否可以在不将Parquet文件加载到内存的情况下编写sql表?
1条答案
按热度按时间q9yhzks01#
我缺乏这方面的经验
T-sql
批量进口和出口,但这是你可能会找到你的答案。我用这个
T-sql
他自己的bulk insert
命令。免责声明我尚未在中使用此命令
T-sql
,所以它可能充满了错误。例如,我在文档中找不到指定snappy压缩的位置,但是如果使用CREATE EXTERNAL FILE FORMAT
.现在,上面的只插入到现有表中。对于您希望从文件创建新表的特定情况,您可能会寻找更多
OPENROWSET
使用CREATE TABLE AS [select statement]
.哪里
column_defs
将是一个命名的列表或向量,描述每个列的sql数据类型定义。t-sql文档页上提供了从r数据类型到的(或多或少)完整翻译(注意两个非常必要的翻译:Date
以及POSIXlt
不存在)。再次声明:我在t-sql的时间没有得到批量插入或类似的。