python 大数据分析

toe95027  于 2023-05-27  发布在  Python
关注(0)|答案(3)|浏览(175)

我试图分析大量的GitHub归档数据,并被许多限制所困扰。
所以我的分析也需要我搜索一个350 GB的数据集。我有数据的本地副本,也有一个副本可通过谷歌BigQuery。本地数据集被拆分为25000个单独的文件。数据集是事件的时间轴。
我想绘制每个存储库自创建以来拥有的星的数量。(仅适用于当前大于1000的回购)
我可以使用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

我真的被难倒了,所以在这一点上的任何建议将不胜感激。

sqxo8psd

sqxo8psd1#

如果大多数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的费用。
这对你来说可能还不够便宜,但只是把选择抛在外面。

px9o7tmv

px9o7tmv2#

我找到了解决这个问题的方法-使用数据库。我从我的360+GB的JSON数据中导入相关数据到MySQL数据库,并查询该数据库。过去每个元素的查询时间为3小时以上,现在变为<10秒。
MySQL不是最容易设置的东西,导入大约花了7.5个小时,但结果对我来说是值得的。

yks3o0rb

yks3o0rb3#

通过这个问题,您将了解到编程的基础知识,在经典的“Donald E. Knuth:计算机编程的艺术第三卷:排序和搜索。如果你想要高效的搜索,而不需要在每个查询上对数据集进行全扫描,你必须首先建立数据的索引/哈希,然后使用快速搜索算法。
这就是google所做的,也是你通过将数据放入mysql表中间接做的,mysql表积极地使用索引来加速数据选择。
您可以使用一些本地文本搜索引擎,例如Whoosh。现在不需要从头开始发明轮子了)。

相关问题