我已经阅读了大约15个csv文件:
df = dd.read_csv("gs://project/*.csv", blocksize=25e6,
storage_options={'token': fs.session.credentials})
然后我保留了数据框(它使用7.33 GB内存):
df = df.persist()
我设置了一个新索引,因为我希望在该字段上的分组依据尽可能高效:
df = df.set_index('column_a').persist()
现在我有181个分区和180个分区。 为了测试group by进行的速度,我尝试了一个自定义套用功能,该功能仅打印Group Dataframe:
grouped_by_index = df.groupby('column_a').apply(lambda n: print(n)).compute()
这打印了一个带有正确列的数据框,但是值是“ 1”,“ foo”或“ True”。示例:
column_b column_c column_d column_e column_f column_g \
index
a foo 1 foo 1 1 1
我也收到警告:
/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内核的入口点。
这是怎么回事?
答案 0 :(得分:1)
实际上,如果您阅读了apply
的文档,您将看到meta=
是可以传递的参数,它告诉Dask如何期望该操作的输出看起来如何。这是必要的,因为apply
可以做非常普通的事情。
如果您不提供meta=
(例如您的情况),那么Dask将尝试使用示例迷你数据帧为该操作植入种子,该示例迷你数据帧的任何数字列均包含1,“ foo ”作为文本,仅查看输出结果。由于您在apply
中进行了打印(并且实际上没有返回任何内容),因此您会看到此种子。
如文档所建议,最好总是提供meta=
,这样就可以避免整个过程。