【问题标题】:Large Data Analytics大数据分析
【发布时间】:2014-08-02 23:04:12
【问题描述】:

我正在尝试分析大量 GitHub 存档数据,但受到许多限制的困扰。

所以我的分析也需要我搜索一个 350GB 的数据集。我有数据的本地副本,也有通过 Google BigQuery 获得的副本。本地数据集分为 25000 个单独的文件。数据集是事件的时间线。

我想绘制每个存储库自创建以来的星数。 (仅适用于当前 > 1000 的 repos)

我可以使用 Google BigQuery 非常快速地获得此结果,但它每次“分析”13.6GB 的数据。这将我限制为

我的另一个选择是搜索我的本地副本,但是在每个文件中搜索特定字符串(存储库名称)的时间太长了。在我终止进程之前,我在 SSD 驱动器上花了一个多小时来处理一半的文件。

有什么更好的方法可以分析如此大量的数据?

用于搜索所有本地文件的 Python 代码:

for yy in range(11,15):
                    for mm in range(1,13):
                        for dd in range(1,32):
                            for hh in range(0,24):
                                counter = counter + 1
                                if counter < startAt:
                                    continue    
                                if counter > stopAt:
                                    continue
                                #print counter
                                strHH = str(hh)
                                strDD = str(dd)
                                strMM = str(mm)
                                strYY = str(yy)
                                if len(strDD) == 1:
                                    strDD = "0" + strDD
                                if len(strMM) == 1:
                                    strMM = "0" + strMM
                                #print strYY + "-" + strMM + "-" + strDD + "-" + strHH
                                try:
                                    f = json.load (open ("/Volumes/WD_1TB/GitHub Archive/20"+strYY+"-"+strMM+"-"+strDD+"-"+strHH+".json", 'r') , cls=ConcatJSONDecoder)
                                    for each_event in f:
                                        if(each_event["type"] == "WatchEvent"):
                                            try:
                                                num_stars = int(each_event["repository"]["watchers"])
                                                created_at = each_event["created_at"]
                                                json_entry[4][created_at] = num_stars
                                            except Exception, e:
                                                print e
                                except Exception, e:
                                    print e

Google 大查询 SQL 命令:

SELECT repository_owner, repository_name, repository_watchers, created_at
  FROM [githubarchive:github.timeline]
  WHERE type = "WatchEvent"
  AND repository_owner = "mojombo"
  AND repository_name = "grit"
  ORDER BY created_at

我真的很难过,所以在这一点上的任何建议都将不胜感激。

【问题讨论】:

  • 您声称您使用的是 SSD,但您的 python 代码中硬编码的路径却暗示了其他情况。您真的将 350GB 的数据存储在 SSD 上吗?
  • 当我运行诊断程序时,我的 SSD 上大约有 100GB。其余数据存储在外部。我将把它全部转移到我的主要驱动器上进行最终分析。
  • grep -r mojombo your-directory-with-github-data 需要多少时间?
  • 您每次都运行相同的查询吗?我知道 bigquery 会缓存结果,所以如果您正在运行相同的查询,您可能不会因为再次运行该查询而收取费用
  • @liori 花了大约 25 分钟

标签: python database bigdata google-bigquery data-analysis


【解决方案1】:

如果您的大多数 BigQuery 查询只扫描数据的一个子集,您可以执行一个初始查询来提取该子集(使用“允许大结果”)。然后针对您的小表的后续查询将花费更少。

例如,如果您只查询 type = "WatchEvent" 的记录,则可以运行如下查询:

SELECT repository_owner, repository_name, repository_watchers, created_at
FROM [githubarchive:github.timeline]
WHERE type = "WatchEvent"

并设置目标表以及“允许大型结果”标志。此查询将扫描完整的 13.6 GB,但输出仅为 1 GB,因此后续针对输出表的查询最多只会向您收取 1 GB 的费用。

这对你来说可能还不够便宜,但只是把选项扔在那里。

【讨论】:

  • 感谢您的建议!导出 1GB 表也将花费 $$。我真的很想能够免费完成这项挑战。
  • 没有免费的东西。有Know-how 来构建这样的系统,然后是运行数据的基础设施。如果您将所有这些麻烦与 BigQuery 之类的东西进行比较,您会发现它很便宜。无论如何,您可以直接在 BQ 中尝试较小的数据集,看看它是如何进行的,然后您可以导入所有数据。
  • 要下载这么多数据需要购买相当多的存储空间。即使我确实设法购买了存储,我相信在有限范围内搜索数据仍然需要花钱。我正在查看超过 5000 个查询,所以这将超过 10,000 美元
  • 5000 条 1 GB 表的查询将花费 25 美元,而不是 10,000 美元。如果保存整整一个月,保存表格将花费 0.03 美元。
【解决方案2】:

我找到了解决这个问题的方法 - 使用数据库。我将 360+GB JSON 数据中的相关数据导入 MySQL 数据库,然后改为查询。过去每个元素 3 小时以上的查询时间变成了

MySQL 不是最容易设置的东西,导入大约需要 7.5 小时,但结果对我来说非常值得。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2015-08-16
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多