ruby-on-rails - 将大型数据集导入数据库

标签 ruby-on-rails json postgresql import dataset

我是这个问题相关领域的初级程序员,所以如果可能的话,避免假设我已经知道很多东西会很有帮助。

我正在尝试将 OpenLibrary 数据集导入本地 Postgres 数据库。导入后,我计划将其用作 Ruby on Rails 应用程序的起始种子,该应用程序将包含书籍信息。

此处提供 OpenLibrary 数据集,采用修改后的 JSON 格式: http://openlibrary.org/dev/docs/jsondump

我的申请只需要非常基本的信息,比转储中提供的信息少得多。我只是想找出书名、作者姓名以及书与作者之间的关系。

下面是他们数据集中的两个典型条目,第一个是作者,第二个是一本书(他们似乎每本书的版本都有一个条目)。在包含实际的 JSON 数据库转储之前,条目似乎以主键开头,然后以类型开头。

/a/OL2A /type/author {"name": "U. Venkatakrishna Rao", "personal_name": "U. Venkatakrishna Rao", "last_modified": {"type": "/type/datetime", "value": "2008-09-10 08:44:01.978456"}, "key": "/a/OL2A", "birth_date": "1904", "type": {"key": "/type/author"}, "id": 99, "revision": 3}

/b/OL345M /type/edition {"publishers": ["Social Science Research Project, Dept. of Geography, University of Dacca"], "pagination": "ii, 54 p.", "title": "Land use in Fayadabad area", "lccn": ["sa 65000491"], "subject_place": ["East Pakistan", "Dacca region."], "number_of_pages": 54, "languages": [{"comment": "initial import", "code": "eng", "name": "English", "key": "/l/eng"}], "lc_classifications": ["S471.P162 E23"], "publish_date": "1963", "publish_country": "pk ", "key": "/b/OL345M", "authors": [{"birth_date": "1911", "name": "Nafis Ahmad", "key": "/a/OL302A", "personal_name": "Nafis Ahmad"}], "publish_places": ["Dacca, East Pakistan"], "by_statement": "[by] Nafis Ahmad and F. Karim Khan.", "oclc_numbers": ["4671066"], "contributions": ["Khan, Fazle Karim, joint author."], "subjects": ["Land use -- East Pakistan -- Dacca region."]}

未压缩转储的大小非常大,作者列表大约 2GB,书籍版本列表大约 18GB。 OpenLibrary 本身不为此提供任何工具,他们提供了一个简单的未优化的 Python 脚本来读取样本数据(这与实际转储以纯 JSON 格式出现不同),但他们估计如果为了在他们的实际数据上使用而修改它会需要 2 个月 (!) 才能完成数据加载。

如何将其读入数据库?我假设我需要编写一个程序来执行此操作。关于我应该如何在合理的时间内完成的语言和指导?我唯一使用过的脚本语言是 Ruby。

最佳答案

从他们的网站下载转储需要两个月的时间。但导入它应该只需要几个小时。

最快的方法是使用 Postgres 的复制命令。您可以将其用于作者的文件。但是 editions 文件需要插入到 books 和 author_books 表中。

此脚本使用 Python 2.6,但如果需要,您应该能够适应 Ruby。

!#/usr/bin/env python
import json

fp = open('editions.json')
ab_out = open('/tmp/author_book.dump', 'w')
b_out = open('/tmp/book.dump', 'w')
for line in fp:
  vals = json.loads(s.split('/type/edition ')[1])
  b_out.write("%(key)s\t%(title)s\t(publish_date)s" % vals)
  for author in vals['authors']:
    ab_out.write("%s\t%s" % (vals['key'], author['key'])
fp.close()
ab_out.close()
b_out.close()

然后复制到 Postgres:

COPY book_table FROM '/tmp/book.dump'

关于ruby-on-rails - 将大型数据集导入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2449166/

相关文章:

ruby-on-rails - 无法通过 Heroku 和 CloudFlare 访问 Rails 应用程序

ruby-on-rails - 复杂算法应该在哪里进行计算

java - 比较两个 JSONObject 结构(忽略它们的值)?

javascript - 如何将 utf-8 数据从 Django 传递到 javascript

javascript - 映射到 json 并使用 javascript 转换为 html 时得到额外的逗号

sql - Postgres 专属标签搜索

mysql - Windows 上的 CPU 使用率 PostgreSQL 与 MySQL

ruby-on-rails - 如何使用在 url 中也有数据的 net/http 发布 xml 数据

ruby-on-rails - capybara :如何断言给定数量的元素存在

python - 将 Django RawQuerySet 转换为查询集