使用pyarrow读取镶木地板文件时如何解码字典列?

塞西莉亚

我有三个.snappy.parquet存储在S3存储桶的文件,我试图用pandas.read_parquet(),但是当我指定一个单一的实木复合地板的文件,它唯一的工作如:df = pandas.read_parquet("s3://bucketname/xxx.snappy.parquet"),但是如果我不指定文件名df = pandas.read_parquet("s3://bucketname"),这是不行的,它给我的错误:Seek before start of file.

我做了很多阅读,然后我找到了这个页面

它表明我们可以pyarrow用来读取多个镶木地板文件,所以这是我尝试过的:

import s3fs
import import pyarrow.parquet as pq
s3 = s3fs.S3FileSystem()
bucket_uri = f's3://bucketname'

data = pq.ParquetDataset(bucket_uri, filesystem=s3)
df = data.read().to_pandas()

这是有效的,但我发现其中一列的值df是一个字典,我如何解码这个字典并将选定的key作为列名和value相应的值?

例如,当前列:

column_1
{'Id': 'xxxxx', 'name': 'xxxxx','age': 'xxxxx'....}

预期列:

Id    age
xxx   xxx
xxx   xxx

这是输出data.read().schema

column_0: string
  -- field metadata --
  PARQUET:field_id: '1'
column_1: struct<Id: string, name: string, age: string,.......>
  child 0, Id: string
    -- field metadata --
    PARQUET:field_id: '3'
  child 1, name: string
    -- field metadata --
    PARQUET:field_id: '7'
  child 2, age: string
    -- field metadata --
    PARQUET:field_id: '8'
  ...........
...........
0x26res

您有一个具有“结构类型”的列,并且您想将其展平。为此,请在调用之前调用flattento_pandas

import pyarrow as pa

COLUMN1_SCHEMA = pa.struct([('Id', pa.string()), ('Name', pa.string()), ('Age', pa.string())])
SCHEMA = pa.schema([("column1", COLUMN1_SCHEMA), ('column2', pa.int32())])

df = pd.DataFrame({
    "column1": [("1", "foo", "16"), ("2", "bar", "17"), ],
    "column2": [1, 2],
})
pa.Table.from_pandas(df, SCHEMA).to_pandas() #  without flatten

| column1                                 |   column2 |
|:----------------------------------------|----------:|
| {'Id': '1', 'Name': 'foo', 'Age': '16'} |         1 |
| {'Id': '2', 'Name': 'bar', 'Age': '17'} |         2 |

pa.Table.from_pandas(df, SCHEMA).flatten().to_pandas() #  with flatten
|   column1.Id | column1.Name   |   column1.Age |   column2 |
|-------------:|:---------------|--------------:|----------:|
|            1 | foo            |            16 |         1 |
|            2 | bar            |            17 |         2 |

作为旁注,您不应将其称为dictionary列。dictionary在 pyarrow 中加载术语,通常指代编码

编辑:如何读取镶木地板中的列子集

import pyarrow.parquet as pq

table = pa.Table.from_pandas(df, SCHEMA)
pq.write_table(table, 'data.pq')
# Using read_table:
pq.read_table('data.pq', columns=['column1.Id', 'column1.Age'])
# Using ParquetDataSet:
pq.ParquetDataset('data.pq').read(columns=['column1.Id', 'column1.Age'])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Pyarrow更改镶木地板文件中的列名?

使用pyspark读取镶木地板文件时如何指定架构?

加载索引具有冗余列的镶木地板文件时出现 pyarrow 问题

如何使用 pyarrow 流式处理镶木地板?

使用pyarrow如何将其附加到镶木地板文件中?

使用镶木地板工具打开镶木地板文件时出错

使用 PyArrow 从多个文件中读取分区的镶木地板数据集,并根据文件名添加分区键

使用通配符通过火花读取镶木地板文件

在 nodejs 中读取镶木地板文件

如何使用 akka 流或 alpakka 从 S3 读取镶木地板文件

PyArrow:使用嵌套类型在镶木地板中存储字典列表

使用pyarrow从分区的镶木地板数据集中读取特定的分区

如何使用Spark(pyspark)编写镶木地板文件?

如何使用 Pyspark 并行处理多个镶木地板文件?

编写镶木地板文件时发出

如何使用镶木地板文件源重命名AWS Athena列?

Apache-Drill 查询镶木地板文件:镶木地板记录读取器出错

使用pandas.DataFrame将镶木地板文件写入CSV文件时如何防止表格格式?

从Spark中的镶木地板文件读取特定列的有效方法

从 spark 读取 gzip 压缩的镶木地板文件

SparkSQL-直接读取镶木地板文件

在Spark中同时读取几个镶木地板文件

蜂巢在火花上。读取镶木地板文件

在AWS Glue中读取镶木地板文件

无法从镶木地板读取零件文件

在Spark中高效读取嵌套的镶木地板列

使用从镶木地板文件创建的dask数据帧时内存使用过多

使用 fastparquet 在子文件上划分镶木地板文件

在 gcs 上使用镶木地板文件创建新的大查询外部表时。显示错误