gpt4 book ai didi

python - 使用 Array> 列读取 Parquet 文件

转载 作者:行者123 更新时间:2023-12-04 14:19:00 30 4
gpt4 key购买 nike

我正在使用 Dask 读取由 PySpark 生成的 Parquet 文件,其中一列是字典列表(即 array<map<string,string>>' )。 df 的一个例子是:

import pandas as pd

df = pd.DataFrame.from_records([
(1, [{'job_id': 1, 'started': '2019-07-04'}, {'job_id': 2, 'started': '2019-05-04'}], 100),
(5, [{'job_id': 3, 'started': '2015-06-04'}, {'job_id': 9, 'started': '2019-02-02'}], 540)],
columns=['uid', 'job_history', 'latency']
)

使用时 engine='fastparquet , Dask 可以正常读取所有其他列,但返回一列 None s 表示具有复杂类型的列。当我设置 engine='pyarrow' ,我得到以下异常:

ArrowNotImplementedError: lists with structs are not supported.

很多谷歌搜索已经清楚地表明,现在并不真正支持读取带有嵌套数组的列,而且我不完全确定处理这个问题的最佳方法是什么。我想我的选择是:
  • 一些如何告诉 dask/fastparquet 使用标准 json 解析列的方法图书馆。模式很简单,如果可能的话,它可以完成这项工作
  • 看看我是否可以重新运行生成输出的 Spark 作业并将其另存为其他内容,尽管这几乎不是可接受的解决方案,因为我的公司到处都使用 Parquet
  • 将 map 的键转换为列,并使用 dtype list 将数据分成几列并注意这些列中的数据通过索引相互关联/映射(例如 idx 0 中的元素在这些键/列中都来自同一个源)。这会奏效,但坦率地说,让我心碎:(

  • 我很想听听其他人是如何解决这个限制的。我的公司经常在他们的 parquest 中使用嵌套数组,因此我不想放弃使用 Dask。

    最佳答案

    我正在处理 pyarrow.lib.ArrowNotImplementedError: Reading lists of structs from Parquet files not yet supported当我尝试使用 Pandas 阅读时;但是,当我使用 pyspark 读取然后转换为 Pandas 时,数据至少会加载:

    import pyspark
    spark = pyspark.sql.SparkSession.builder.getOrCreate()
    df = spark.read.load(path)
    pdf = df.toPandas()

    并且违规字段现在呈现为 pyspark Row 对象,它具有一些结构化解析,但您可能必须编写自定义 Pandas 函数来从中提取数据:
    >>> pdf["user"][0]["sessions"][0]["views"]
    [Row(is_search=True, price=None, search_string='ABC', segment='listing', time=1571250719.393951), Row(is_search=True, price=None, search_string='ZYX', segment='homepage', time=1571250791.588197), Row(is_search=True, price=None, search_string='XYZ', segment='listing', time=1571250824.106184)]

    单个记录可以呈现为字典,只需调用 .asDict(recursive=True)在您想要的 Row 对象上。

    不幸的是,启动 SparkSession 上下文需要大约 5 秒,并且每个 spark 操作也比 Pandas 操作花费的时间长得多(对于中小型数据集)所以我更喜欢更 Python 原生的选项

    关于python - 使用 Array<Map<String,String>> 列读取 Parquet 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57024057/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com