Sta*_*nko 6 dataframe dask dask-distributed
我读过大约 15 个 csv 文件:
df = dd.read_csv("gs://project/*.csv", blocksize=25e6,
storage_options={'token': fs.session.credentials})
Run Code Online (Sandbox Code Playgroud)
然后我保留了 Dataframe(它使用 7.33 GB 内存):
df = df.persist()
Run Code Online (Sandbox Code Playgroud)
我设置了一个新索引,因为我希望该字段上的分组尽可能高效:
df = df.set_index('column_a').persist()
Run Code Online (Sandbox Code Playgroud)
现在我有181个分区,180个分区。为了尝试我的分组速度有多快,我尝试了一个自定义应用函数,该函数仅打印组数据帧:
grouped_by_index = df.groupby('column_a').apply(lambda n: print(n)).compute()
Run Code Online (Sandbox Code Playgroud)
打印了一个包含正确列的数据框,但值为“1”、“foo”或“True”。例子:
column_b column_c column_d column_e column_f column_g \
index
a foo 1 foo 1 1 1
Run Code Online (Sandbox Code Playgroud)
我也收到警告:
/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:1:UserWarning:
meta未指定,从部分数据推断。meta如果结果出乎意料,请提供。之前: .apply(func) 之后: .apply(func, meta={'x': 'f8', 'y': 'f8'}) 对于数据帧结果或: .apply(func, meta=('x' , 'f8'))
用于系列结果“”“启动 IPython 内核的入口点。
这里发生了什么?
事实上,如果您阅读 的文档apply,您将看到这meta=是一个可以传递的参数,它告诉 Dask 如何期望操作的输出。这是必要的,因为apply可以做非常一般的事情。
如果您不提供meta=,就像您的情况一样,Dask 将尝试使用示例迷你数据框来种子操作,其中包含 1 表示任何数字列,“foo”表示文本列,只是为了看看输出会是什么样子。由于在您apply打印中(并且实际上不返回任何内容),因此您看到了这个种子。
正如文档所建议的,您最好meta=尽可能提供,这样就可以避免过程中的整个步骤。
| 归档时间: |
|
| 查看次数: |
2115 次 |
| 最近记录: |