Python 从文件读取连接行李时出现意外行为

Python 从文件读取连接行李时出现意外行为,python,dask,Python,Dask,我是Dask的新手,来自Apache Spark平台。 我试图在Dask中复制一个例程,在这里我每天加载JSON文件,并选择一些字段用于下游计算。 我发现for循环没有展开,因此在我的例子中,只有最后一次追加是有效的,这是文件数据的最后一天。我相信在append操作期间我需要某种形式的copy操作符来生成该数据帧的副本,但我无法从文档中找到任何信息。 我目前的解决方法是计算熊猫数据帧并附加它,这没问题,但我想知道是否有更好的方法 import dask import json import os

我是Dask的新手,来自Apache Spark平台。 我试图在Dask中复制一个例程,在这里我每天加载JSON文件,并选择一些字段用于下游计算。 我发现for循环没有展开,因此在我的例子中,只有最后一次追加是有效的,这是文件数据的最后一天。我相信在append操作期间我需要某种形式的copy操作符来生成该数据帧的副本,但我无法从文档中找到任何信息。 我目前的解决方法是计算熊猫数据帧并附加它,这没问题,但我想知道是否有更好的方法

import dask
import json
import os

os.makedirs('demodata', exist_ok=True)              # Create data/ directory

b = dask.datasets.make_people()                 # Make records of people
b.map(json.dumps).to_textfiles('demodata/*.json')   # Encode as JSON, write to disk

dict_filter = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])

bags = []

for in_path in glob.glob('demodata/*.json'):
    
    in_path = Path(in_path)

    file_str = in_path.stem
    print('Loading file %s' % file_str)
    json_bag = db.read_text(in_path).map(json.loads)
    filtered_bag = json_bag.map(lambda evt: dict_filter(evt, ['age','name']))
    file_dict ={'filename':file_str}
    file_bag = filtered_bag.map(lambda d: {**d,**file_dict} )
    
    bags.append(file_bag)
    
all_bags = db.concat(bags)
all_people = all_bags.to_dataframe().compute()

assert all_people.filename.nunique() == 10

我想我们可以不用循环,通过使用关键字参数来解决这个问题

将dask.bag作为数据库导入 导入json 导入操作系统 只运行过一次,然后就没有了 进口达斯克 os.makedirsdemodata,exist\u ok=True创建数据/目录 b=dask.datasets.make_人员记录人员 b、 mapjson.dumps.to_textfilesdemdata/*.json编码为json,写入磁盘 get_keys=lambda d,keys:{key:d[key]如果key-in-keys} df= db.read\u textdemata/*.json,include\u path=True .maplambda x:{**json.loadsx[0],**dictfilename=os.path.basenamex[1]} .maplambda evt:get_keysevt[年龄、名称、文件名] .to_数据帧 计算 printdf 断言df.filename.nunique==10 打印出来

     age                 name filename
0     50    [Chieko, Daniels]   0.json
1     52       [Irina, Tyson]   0.json
2     63      [Ali, O'connor]   0.json
3     47   [Doretta, Wiggins]   0.json
4     22   [Gregorio, Barnes]   0.json
..   ...                  ...      ...
995   49        [Lory, Combs]   9.json
996   43      [Nicky, Mullen]   9.json
997   57  [Carolyne, Mendoza]   9.json
998   58     [Arthur, Monroe]   9.json
999   40        [Shin, Nunez]   9.json

这回答了你的问题吗?或者您是在寻找稍有不同的东西?

如果您可以删除与gz无关的部分,过滤、更新并给出示例数据和预期输出,那将非常方便。我做的一件事是:更新不会返回任何内容。Ehy肯定会简化示例给我一天时间。@mdurant请查看更新的示例,可能是字典创建?您好,是的,这很有帮助,但我想了解为什么使用for循环DAG无法正确组合多个行李?在某些情况下,我仍然必须使用for循环,例如当存在gzip json文件时。我只是想了解更多的幕后情况。