标签: pyarrow

从/向镶木地板文件读取/写入 pyarrow 张量

pyarrow 中,将 a pyarrow.Tensor(例如从 a 创建numpy.ndarray)写入 Parquet 文件的建议方法是什么?甚至有可能无需通过pyarrow.Tableandpandas.DataFrame吗?

numpy parquet tensor pyarrow

6
推荐指数
1
解决办法
1377
查看次数

是否有任何Python库支持将结构数组写入Parquet文件?

我想将其中某些列是字符串数组或结构数组(通常是键值对)的数据写入Parquet文件中,以便在AWS Athena中使用。

找到两个Python库(Arrow和fastparquet)以支持对Parquet文件的写入之后,我努力尝试了一段时间以获取结构数组。

编写Parquet文件的问题的最高答案列出了这两个库(并提到缺乏对嵌套数据的支持)。

那么有没有办法从Python将嵌套数据写入Parquet文件?


我尝试使用Arrow进行以下操作以存储键/值。

import pyarrow as pa
import pyarrow.parquet as pq

countries = []
populations = []

countries.append('Sweden')
populations.append([{'city': 'Stockholm', 'population': 1515017}, {'city': 'Gothenburg', 'population': 590580}])
countries.append('Norway')
populations.append([{'city': 'Oslo', 'population': 958378}, {'city': 'Bergen', 'population': 254235}])


ty = pa.struct([pa.field('city', pa.string()),
                pa.field('population', pa.int32())
])

fields = [
    pa.field('country', pa.string()),
    pa.field('populations', pa.list_(ty)),
]
sch1 = pa.schema(fields)

data = [
    pa.array(countries),
    pa.array(populations, type=pa.list_(ty))
]
batch = pa.RecordBatch.from_arrays(data, ['f0', 'f1'])
table = pa.Table.from_batches([batch], sch1)
writer = pq.ParquetWriter('cities.parquet', sch1)
writer.write_table(table)
writer.close() …
Run Code Online (Sandbox Code Playgroud)

python parquet fastparquet pyarrow

6
推荐指数
1
解决办法
1317
查看次数

RuntimeError: Unsupported type in conversion to Arrow: VectorUDT

我想将一个大的 spark 数据框转换为超过 1000000 行的 Pandas。我尝试使用以下代码将 spark 数据帧转换为 Pandas 数据帧:

spark.conf.set("spark.sql.execution.arrow.enabled", "true")
result.toPandas()
Run Code Online (Sandbox Code Playgroud)

但是,我得到了错误:

TypeError                                 Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/pyspark/sql/dataframe.py in toPandas(self)
   1949                 import pyarrow
-> 1950                 to_arrow_schema(self.schema)
   1951                 tables = self._collectAsArrow()

/usr/local/lib/python3.6/dist-packages/pyspark/sql/types.py in to_arrow_schema(schema)
   1650     fields = [pa.field(field.name, to_arrow_type(field.dataType), nullable=field.nullable)
-> 1651               for field in schema]
   1652     return pa.schema(fields)

/usr/local/lib/python3.6/dist-packages/pyspark/sql/types.py in <listcomp>(.0)
   1650     fields = [pa.field(field.name, to_arrow_type(field.dataType), nullable=field.nullable)
-> 1651               for field in schema]
   1652     return pa.schema(fields)

/usr/local/lib/python3.6/dist-packages/pyspark/sql/types.py in to_arrow_type(dt)
   1641     else:
-> 1642         raise TypeError("Unsupported type in …
Run Code Online (Sandbox Code Playgroud)

dataframe pandas apache-spark pyspark pyarrow

6
推荐指数
1
解决办法
4822
查看次数

Pandas Dataframe Parquet数据类型?

我正在尝试使用Pandas和Pyarrow拼花数据。我有数百个实木复合地板文件,它们不需要具有相同的架构,但是如果各个实木复合地板之间的列匹配,则它们必须具有相同的数据类型。

我遇到的情况是生成的实木复合地板数据类型不是我想要的。例如,我可能将“ an”写入int64一列,并且生成的拼花地板将采用double格式。这会在处理方面造成很多麻烦,因为正确输入了99%的数据,但在1%的情况下,这只是错误的类型。

我试过导入numpy并以这种方式包装值-

import numpy as np

pandas.DataFrame({
  'a': [ np.int64(5100), np.int64(5200), np.int64(5300) ]
})
Run Code Online (Sandbox Code Playgroud)

但是我偶尔还是会拿到双,所以这一定是错误的方法。如何确保镶木地板文件中各列的数据类型一致?

更新-

我发现只有在列包含一个或多个Nones 时才会发生这种情况。

data_frame = pandas.DataFrame({
  'a': [ None, np.int64(5200), np.int64(5200) ]
})
Run Code Online (Sandbox Code Playgroud)

实木复合地板不能处理混合的None-int64 cols吗?

python numpy pandas parquet pyarrow

6
推荐指数
1
解决办法
1423
查看次数

迭代 Pyarrow 表的最快方法

我正在使用 Pyarrow 库来优化 Pandas DataFrame 的存储。我需要尽可能快地逐行处理 pyarrow Table 而不将其转换为 Pandas DataFrame(它不适合内存)。Pandas 有 iterrows()/iterrtuples() 方法。除了 for 循环和索引寻址之外,是否有任何快速迭代 Pyarrow Table 的方法?

pandas pyarrow

6
推荐指数
3
解决办法
3893
查看次数

使用 read_parquet 的 Parquet 文件中带有分类列的 Pandas DataFrame?

我正在将大型 CSV 文件转换为 Parquet 文件以供进一步分析。我将 CSV 数据读入 Pandas 并按dtypes如下方式指定列

_dtype = {"column_1": "float64",
          "column_2": "category",
          "column_3": "int64",
          "column_4": "int64"}

df = pd.read_csv("data.csv", dtype=_dtype)
Run Code Online (Sandbox Code Playgroud)

然后我做一些更多的数据清理并将数据写入 Parquet 以供下游使用。

_parquet_kwargs = {"engine": "pyarrow",
                   "compression": "snappy",
                   "index": False}

df.to_parquet("data.parquet", **_parquet_kwargs)
Run Code Online (Sandbox Code Playgroud)

但是当我使用 Pandas 将数据读入进行进一步分析时,from_parquet我似乎无法恢复类别 dtypes。下列

df = pd.read_parquet("data.parquet")
Run Code Online (Sandbox Code Playgroud)

结果DataFrameobjectdtypes 代替了所需的category.

以下似乎按预期工作

import pyarrow.parquet as pq

_table = (pq.ParquetFile("data.parquet")
            .read(use_pandas_metadata=True))

df = _table.to_pandas(strings_to_categorical=True)
Run Code Online (Sandbox Code Playgroud)

但是我想知道如何使用pd.read_parquet.

python-3.x pandas parquet pyarrow

6
推荐指数
1
解决办法
4680
查看次数

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

我想使用 PyArrow 将以下 Pandas 数据框存储在镶木地板文件中:

import pandas as pd
df = pd.DataFrame({'field': [[{}, {}]]})
Run Code Online (Sandbox Code Playgroud)

field列的类型是字典列表:

      field
0  [{}, {}]

Run Code Online (Sandbox Code Playgroud)

我首先定义相应的 PyArrow 架构:

import pyarrow as pa
schema = pa.schema([pa.field('field', pa.list_(pa.struct([])))])
Run Code Online (Sandbox Code Playgroud)

然后我使用from_pandas()

table = pa.Table.from_pandas(df, schema=schema, preserve_index=False)
Run Code Online (Sandbox Code Playgroud)

这将引发以下异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "table.pxi", line 930, in pyarrow.lib.Table.from_pandas
  File "/anaconda3/lib/python3.6/site-packages/pyarrow/pandas_compat.py", line 371, in dataframe_to_arrays
    convert_types)]
  File "/anaconda3/lib/python3.6/site-packages/pyarrow/pandas_compat.py", line 370, in <listcomp>
    for c, t in zip(columns_to_convert,
  File "/anaconda3/lib/python3.6/site-packages/pyarrow/pandas_compat.py", line 366, in …
Run Code Online (Sandbox Code Playgroud)

python pandas parquet pyarrow

6
推荐指数
1
解决办法
3889
查看次数

“pyarrow.lib.ArrowInvalid: Casting from timestamp[ns] to timestamp[ms] 将丢失数据”当将数据发送到没有架构的 BigQuery 时

我正在编写一个向 BigQuery 发送数据帧的脚本:

load_job = bq_client.load_table_from_dataframe(
    df, '.'.join([PROJECT, DATASET, PROGRAMS_TABLE])
)

# Wait for the load job to complete
return load_job.result() 
Run Code Online (Sandbox Code Playgroud)

这工作正常,但前提是已经在 BigQuery 中定义了架构,或者我在脚本中定义了我的工作架构。如果未定义架构,则会出现以下错误:

Traceback (most recent call last): File "/env/local/lib/python3.7/site-packages/google/cloud/bigquery/client.py", line 1661, in load_table_from_dataframe dataframe.to_parquet(tmppath, compression=parquet_compression) File "/env/local/lib/python3.7/site-packages/pandas/core/frame.py", line 2237, in to_parquet **kwargs File "/env/local/lib/python3.7/site-packages/pandas/io/parquet.py", line 254, in to_parquet **kwargs File "/env/local/lib/python3.7/site-packages/pandas/io/parquet.py", line 117, in write **kwargs File "/env/local/lib/python3.7/site-packages/pyarrow/parquet.py", line 1270, in write_table writer.write_table(table, row_group_size=row_group_size) File "/env/local/lib/python3.7/site-packages/pyarrow/parquet.py", line 426, in write_table self.writer.write_table(table, row_group_size=row_group_size) File "pyarrow/_parquet.pyx", line 1311, in pyarrow._parquet.ParquetWriter.write_table …
Run Code Online (Sandbox Code Playgroud)

python-3.x google-bigquery google-cloud-functions pyarrow

6
推荐指数
3
解决办法
5075
查看次数

pyarrow 的构建轮失败

我正在尝试 pip install Superset

pip install apache-superset
Run Code Online (Sandbox Code Playgroud)

并低于错误

 Traceback (most recent call last):
    File "c:\users\saurav_nimesh\appdata\local\programs\python\python38\lib\runpy.py", line 193, in _run_module_as_main
      return _run_code(code, main_globals, None,
    File "c:\users\saurav_nimesh\appdata\local\programs\python\python38\lib\runpy.py", line 86, in _run_code
      exec(code, run_globals)
    File "C:\Users\saurav_nimesh\AppData\Local\Programs\Python\Python38\Scripts\cmake.exe\__main__.py", line 4, in <module>
  ModuleNotFoundError: No module named 'cmake'
  error: command 'C:\\Users\\saurav_nimesh\\AppData\\Local\\Programs\\Python\\Python38\\Scripts\\cmake.exe' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for pyarrow
Failed to build pyarrow
ERROR: Could not build wheels for pyarrow which use PEP 517 and cannot be installed directly
Run Code Online (Sandbox Code Playgroud)

尝试安装 Windows 10 …

cmake pyarrow apache-superset

6
推荐指数
1
解决办法
1万
查看次数

在 Jupyter Notebook 中读取巨大的 .csv 文件

我正在尝试从 Jupyter Notebook (Python) 中的 .csv 文件读取数据

.csv文件大小8.5G,7000万行,30列

当我尝试读取 .csv 时,出现错误。

下面是我的代码

import pandas as pd

log = pd.read_csv('log_20100424.csv', engine = 'python')
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用 pyarrow,但它不起作用。

import pandas as pd
from pyarrow import csv`

log = csv.read('log_20100424.csv').to_pandas()
Run Code Online (Sandbox Code Playgroud)

我的问题是:

如何在 Jupyter Notebook 中读取巨大(8.5G).csv 文件

还有其他方法可以读取巨大的 .csv 文件吗?

我的笔记本电脑有 8GB RAM,运行 64 位 Windows 10,i5-8265U 1.6Ghz。

python csv pandas jupyter-notebook pyarrow

5
推荐指数
1
解决办法
9861
查看次数