我正在尝试将来自Google Cloud Storage或Google BigQuery的千兆字节数据加载到pandas数据框中,以便我可以尝试运行scikit的OneClassSVM和隔离林(或任何其他一元或PU分类)。所以我尝试pandas-gbq
但尝试运行
pd.read_gbq(query, 'my-super-project', dialect='standard')
当我的机器仅完成30%时,它会使其消失。我无法在本地加载它,而且我的机器没有足够的空间,听起来效率也不合理。
我也试过
from google.cloud import storage
client = storage.Client()
bucket = client.get_bucket('bucket-id-here')
# Then do other things...
blob = bucket.get_blob('remote/path/to/file.txt')
print(blob.download_as_string())
一旦我可以加载1/10或1/5的可用数据,但我的机器最终会告诉我内存不足。
TLDR :我是否有办法在云端或远程计算机中运行我的自定义代码(使用numpy,pandas甚至是TensorFlow),我可以轻松有效地从Google加载数据云存储或Google BigQuery?
答案 0 :(得分:3)
我不认为你正朝着正确的方向前进。我将尝试解释我通常如何处理数据,希望这能为您提供一些见解。
我首先倾向于通过应用一些采样技术或查询更少的天数来处理小数据集。在此步骤中,可以使用pandas
或为小数据和构建模型开发的其他工具,提出一些统计信息,查找moments等等。
在我熟悉数据后,我开始使用大数据工具。
具体来说,我有一个非常小的Dataproc群集,我已经设置了jupyter notebook来运行pyspark代码。
群集的总内存必须超过您用作输入的总内存。
使用pandas或spark数据帧对你来说应该是直截了当的,正如你在blog post数据堆中看到的那样,spark已经提供了这个功能。
之后,实现算法。 Spark已经提供了一些开箱即用的built-in algorithms,你可以随意使用它们。
如果您要实现的算法不可用,您可以在其存储库中发出请求或自行构建(您可以使用Python的Scipy实现作为指南并将其转换为spark环境)。
以下是我为我们公司构建推荐系统所使用的算法之一加载数据的示例:
from pyspark.sql import functions as sfunc
from pyspark.sql import types as stypes
schema = stypes.StructType().add("fv", stypes.StringType()).add("sku", stypes.StringType()).add("score", stypes.FloatType())
train_df = spark.read.csv('gs://bucket_name/pyspark/train_data*.gz', header=True, schema=schema)
Spark会自动将这些数据分发到群集中可用的不同工作人员。之后,我主要运行查询和map / reduce步骤以获得skus之间的相关性。
就维护当前代码而言,它可能不会针对大数据进行扩展。然而,你可以找到很多资源来结合numpy和spark的强大功能,例如在this example中。