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


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

Читать.csv.в SQL("рабочих мест.csv", sql = "создать таблицу Jobs2 как SELECT * FROM file", dbname = " Test1.sqlite")

Когда я выполняю следующее:

Sqldf ("select * from Jobs2", dbname= " Test1.sqlite")

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

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

Чего мне здесь не хватает?

Заранее благодарю.

1   6  

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. Необходимость указать его может возникнуть, например, если вы пытаетесь прочитать файл, созданный в одной операционной системе, в другой операционной системе. Смотрите раздел FAQ 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.