从parquet文件创建sql表

cmssoen2  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(432)

我使用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表?

q9yhzks0

q9yhzks01#

我缺乏这方面的经验 T-sql 批量进口和出口,但这是你可能会找到你的答案。

library(arrow)
library(DBI)
test <- data.frame(matrix(rnorm(20), nrow=10))
f <- tempfile(fileext = '.parquet')
write_parquet(test2, f)

# Upload table using bulk insert

dbExecute(connection, 
  paste("
    BULK INSERT [database].[schema].[table]
    FROM '", gsub('\\\\', '/', f), "' FORMAT = 'PARQUET';
  ")
)

我用这个 T-sql 他自己的 bulk insert 命令。
免责声明我尚未在中使用此命令 T-sql ,所以它可能充满了错误。例如,我在文档中找不到指定snappy压缩的位置,但是如果使用 CREATE EXTERNAL FILE FORMAT .
现在,上面的只插入到现有表中。对于您希望从文件创建新表的特定情况,您可能会寻找更多 OPENROWSET 使用 CREATE TABLE AS [select statement] .

column_definition <- paste(names(column_defs), column_defs, collapse = ',')
dbExecute(connection, 
paste0("CREATE TABLE MySqlTable
AS 
SELECT *
FROM 
  OPENROWSET(
    BULK '", f, "' FORMAT = 'PARQUET'
  ) WITH (
    ", paste0([Column definitions], ..., collapse = ', '), "
  );
")

哪里 column_defs 将是一个命名的列表或向量,描述每个列的sql数据类型定义。t-sql文档页上提供了从r数据类型到的(或多或少)完整翻译(注意两个非常必要的翻译: Date 以及 POSIXlt 不存在)。再次声明:我在t-sql的时间没有得到批量插入或类似的。

相关问题