Р: Читать.csv.sql из sqldf может успешно читать один csv, но не другой

У меня есть набор данных, который составляет около 20 ГБ, и поэтому я не могу прочитать его в кадр данных R без нехватки памяти. Прочитав несколько сообщений здесь, я решил использовать read.csv.SQL в базу данных. Код, который я использовал:

читать.csv.sql ("задания.csv", sql = "создать таблицу Jobs2 как SELECT * FROM file", dbname = " Test1.sqlite")

когда я запускаю следующий:

sqldf("выбрать * из Jobs2", dbname= " Test1.sqlite")

Я получаю заголовок столбцов, но тогда нет значения: (или 0-длина строки.имена)

но когда я пытаюсь то же самое с csv, который я создал с помощью набора данных iris, все работает нормально.

Что я пропустила?

спасибо заранее.

1 ответов


sqldf в первую очередь предназначен для обработки фреймов данных, поэтому он создает базы данных и таблицы баз данных прозрачно и удаляет их после завершения sql. Таким образом, ваш первый оператор не будет работать, так как sqldf удалит базу данных после завершения оператора.

если SQL создает базу данных или таблицу, а не сам sqldf, то sqldf не будет знать об этом, поэтому он не удалит ее. Здесь мы создаем базу данных, используя attach и в таблице, используя create table дурак sqldf. В последней строке он не удалит таблицу OIR базы данных, потому что они уже были там до начала этой строки, и он никогда не удаляет объекты, которые он не создавал:

library(sqldf)

read.csv.sql("jobs.csv", sql = c("attach 'test1.sqlite' as new", 
              "create table new.jobs2 as select * from file"))
sqldf("select * from jobs2", dbname = "test1.sqlite")

другая вещь, которая может пойти не так, будет концовка строки. Обычно sqldf может понять это, но если нет, вам может потребоваться указать eol символ. Необходимость указать его может возникнуть, например, при попытке чтения файла, созданного в одной операционной системе, в другой операционная система. См.часто задаваемые вопросы 11. Почему у меня возникли трудности с чтением файла данных с помощью SQLite в sqldf README.

Примечание: read.csv.sql обычно используется только для чтения части данных. Например, это пропускает первые 100 строк, а затем читает колонки a и b из следующих 1000 строк, но запрос может быть произвольно сложным, так как у вас есть все SQL SQLite для использования:

read.csv.sql("jobs.csv", sql = "select a, b from file limit 1000 offset 100")

весь файл чтение во временную базу данных sqlite, но только запрошенная часть когда-либо считывается в R, поэтому весь файл может быть больше, чем R может обрабатывать.

обычно, если кто-то пытается достичь постоянства, он использует RSQLite напрямую, а не sqldf.