Dask read_json元数据不匹配

时间:2018-06-19 12:32:03

标签: dask

我正在尝试将json文件加载到daf df中。

files = glob.glob('**/*.json', recursive=True)
df = dd.read_json(files, lines = False)

数据中缺少一些值,并且某些文件具有额外的列。 有没有一种方法可以指定列列表,因此所有可能的列都将存在于串联的daf df中? 另外,它不能处理缺失值吗?尝试计算df时出现以下错误:

ValueError: Metadata mismatch found in `from_delayed`.

Partition type: `DataFrame`
+-----------------+-------+----------+
| Column          | Found | Expected |
+-----------------+-------+----------+
| x22             | -     | float64  |
| x21             | -     | object   |
| x20             | -     | float64  |
| x19             | -     | float64  |
| x18             | -     | object   |
| x17             | -     | float64  |
| x16             | -     | object   |
| x15             | -     | object   |
| x14             | -     | object   |
| x13             | -     | object   |
| x12             | -     | object   |
| x11             | -     | object   |
| x10             | -     | object   |
| x9              | -     | float64  |
| x8              | -     | object   |
| x7              | -     | object   |
| x6              | -     | object   |
| x5              | -     | int64    |
| x4              | -     | object   |
| x3              | -     | float64  |
| x2              | -     | object   |
| x1              | -     | object   |
+-----------------+-------+----------+

2 个答案:

答案 0 :(得分:2)

read_json()是新的,并针对同类数据的“常见”情况进行了测试。像read_csv一样,它可以扩展为相当容易地处理列选择和数据类型强制。我注意到pandas function允许传递dtype=参数。

这不是答案,但也许您会对在repo提交PR感兴趣?特定代码位于文件dask.dataframe.io.json中。

答案 1 :(得分:0)

我遇到了类似的问题,并提出了另一个解决方案:

def read_data(path, **kwargs):
    meta = dd.read_json(path, **kwargs).head(0)
    meta = meta.head(0)
    # edit meta dataframe to match what's read here

    def json_engine(*args, **kwargs):
        df = pd.read_json(*args, **kwargs)
        # add or drop necessary columns here
        return df

    return dd.read_json(path, meta=meta, engine=json_engine, **kwargs)

因此,此解决方案的想法是您要做两件事:

  1. 根据需要编辑元数据(例如,从中删除不需要的列)
  2. 包装json引擎函数并删除/添加必要的列,以便meta将匹配此函数返回的内容。

示例:

  1. 您有一个特定的不相关列,导致您的代码因错误而失败:
| Column          | Found | Expected     |
| x22             | -     | object       |

在这种情况下,您只需从meta和json_engine()包装器中删除此列即可。

  1. 您有一些相关的列,据报告某些分区缺少这些列。在这种情况下,您将获得与主题启动器类似的错误。

在这种情况下,您需要向具有必要类型的meta添加必要的列(在这种情况下,BTW meta只是空的pandas数据框),并在必要时在json_engine()包装器中将这些列添加为空。

还要查看对https://stackoverflow.com/a/50929229/2727308答案的注释中的提案-改用dask.bag。