daskDataframe连接Parquet文件抛出内存

y3bcpkx1  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(480)

我有1024个Parquet文件,每一个都有1个箱子大小。我在用python dask 把那1024个文件合并成一个文件,我有很大的磁盘空间,但ram是有限的。
使用python有没有有效的方法来解决这个问题 dask ?

import dask.dataframe as dd
def generatePath():
    for i in range(0,1024):
         return "data/2000-" + i +".parquet"

def readDF():
    paths = generatePath()
    for x in paths:
       df = dd.read_parquet(x, columns=['name', 'address'], engine='pyarrow')
       yield df

def mergeDF():
    allDF = readDF()
    df = next(allDF)
    for iter_DF in allDF:
        df = dd.concat([df,iter_DF])
    return df.compute()

这是我的代码,它抛出内存错误。如果我是错误的请纠正我。代码是逐个文件加载并创建每个df,然后连接。在这种情况下,它不需要很多内存?
还有别的办法解决吗?

bmp9r5qi

bmp9r5qi1#

更新的答案
读取多个文件并将其合并为一个文件 .parquet ,试试看 .repartition(1) -看到这个帖子了吗


# Read all files in `data/`

df = dd.read_parquet("data/", columns=['name', 'address'], engine='pyarrow')

# Export to single `.parquet` file

df.repartition(npartitions=1).to_parquet("data/combined", write_metadata_file=False)

这将合并中的所有文件 data/ 变成一个文件

$ ls data/combined
part.0.parquet

注意:使用多个Parquet文件有好处-1,2,3,4。
古老的答案
不需要仅仅为了读取数据而计算。它会很快填满你的公羊。这可能会导致您的内存错误。你可以用 dd.read_parquet 并指定 data/ 直接文件夹

df = dd.read_parquet("data/", columns=['name', 'address'], engine='pyarrow')

相关问题