大数据分析

时间:2014-08-02 23:04:12

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

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

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

我想绘制每个存储库自创建以来所拥有的星数。 (仅适用于目前大于1000的repos)

我可以使用Google BigQuery快速获得此结果,但每次“分析”13.6GB的数据。这限制了我<75次请求而无需每增加75美元支付5美元。

我的另一个选择是搜索我的本地副本,但在每个文件中搜索特定的字符串(存储库名称)需要太长时间。在我杀死进程之前,在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 Big Query 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

我真的很难过,所以在这一点上任何建议都会受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

我找到了解决此问题的方法 - 使用数据库。我将我的360 + GB JSON数据中的相关数据导入MySQL数据库并进行查询。过去每个元素的3小时+查询时间变为&lt; 10秒。

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