据我了解,镶木地板文件具有列的最小/最大统计信息。我的问题是如何在不读取整个文件的情况下使用 python 读取这些统计信息?
如果有帮助,我也有_common_metadata和_metadata文件。
我的具体问题是获取此文件系统中每个证券交易所分区的最大日期(每个年份分区包含多个具有日期列的镶木地板文件):
C:.
? _common_metadata
? _metadata
????source=NASDAQ
? ????year=2017
? ????year=2018
????source=London_Stock_Exchange
? ????year=2014
? ????year=2015
????source=Japan_Exchange_Group
? ????year=2017
? ????year=2018
????source=Euronext
????year=2017
????year=2018
Run Code Online (Sandbox Code Playgroud) 我已经安装了pyarrow槽pip
pip install pyarrow
import pyarrow as pya
Run Code Online (Sandbox Code Playgroud)
如果我调用该属性,orc则会出现以下错误
pya.orc
AttributeError: module 'pyarrow' has no attribute 'orc'
Run Code Online (Sandbox Code Playgroud) 我有一个分区镶木地板数据集,我正在尝试将其读入 pandas 数据帧。完整的镶木地板数据集不适合内存,因此我只需选择一些分区(分区列是年、月和日期。我有以下内容:
pd.read_parquet(
path_to_dataset,
filters=[("Date", ">=", "20200715"), ("Date", "<=", "2020804")]
)
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,出现内存错误/python 程序崩溃。但是,当我运行以下命令时,它可以正常工作,即使理论上它会返回完全相同数量的数据(我的数据集在 4 号停止)。
pd.read_parquet(
path_to_dataset,
filters=[("Date", ">=", "20200715")]
)
Run Code Online (Sandbox Code Playgroud)
似乎第二个过滤器("Date", "<=", "2020804")优先于第一个过滤器,并且不被视为复合表达式。在我当前的用例中,我可以删除第二个过滤器,但在其他情况下,数据将更多地位于总范围的中间,如果没有第二个过滤器,我最终会再次读取太多内容。
我尝试了以下每一项,但没有运气。
(("Date", ">=", "20200715") & ("Date", "<=", "2020804"))
("Date", ">=", "20200715", "Date", "<=", "2020804")
Run Code Online (Sandbox Code Playgroud)
有没有办法处理同一分区/列上的复合表达式?
此处参考文档: https: //arrow.apache.org/docs/python/dataset.html
我从以下位置构建了一个图像: https: //archive.apache.org/dist/spark/spark-$2.4.4/spark-$2.4.4-bin-hadoop2.7.tgz
下载后,我会:
cd spark-2.4.4-bin-hadoop2.7 && bin/docker-image-tool.sh build
Run Code Online (Sandbox Code Playgroud)
然后我的形象spark-py:latest就建立了。
我想使用这个 docker 文件在其中安装 pyarrow:
FROM spark-py:latest
COPY *.jar /opt/spark/jars/
RUN rm /opt/spark/jars/kubernetes-*-4.1.2.jar
RUN apk add --no-cache \
build-base \
cmake \
bash \
boost-dev \
autoconf \
zlib-dev \
flex \
bison \
g++
RUN wget -q https://bootstrap.pypa.io/get-pip.py && python3 get-pip.py && rm -f get-pip.py
RUN apk update
RUN apk add --update --no-cache py3-arrow
Run Code Online (Sandbox Code Playgroud)
但我有一个错误:
> [8/8] RUN apk add --update --no-cache py3-arrow:
#12 0.552 fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
#12 …Run Code Online (Sandbox Code Playgroud) 我知道这可以在 R 中完成,如下所示
ds <- open_dataset("nyc-taxi/csv/2019", format = "csv",
partitioning = "month")
Run Code Online (Sandbox Code Playgroud)
但是有没有办法用Python来做呢?尝试过这些,但似乎这不是一个选择
from pyarrow import csv
table = csv.read_csv("*.csv")
Run Code Online (Sandbox Code Playgroud)
from pyarrow import csv
path = os.getcwd()
table = csv.read_csv(path)
table
Run Code Online (Sandbox Code Playgroud)
有没有办法让它在 python 中发生?
AttributeError: module 'pyarrow' has no attribute 'decimal256' 似乎是bigquery python包的错误,应该如何处理?
整个堆栈是:
File "/opt/conda/default/lib/python3.7/site-packages/google/cloud/bigquery/__init__.py", line 35, in <module>
from google.cloud.bigquery.client import Client
File "/opt/conda/default/lib/python3.7/site-packages/google/cloud/bigquery/client.py", line 70, in <module>
from google.cloud.bigquery import _pandas_helpers
File "/opt/conda/default/lib/python3.7/site-packages/google/cloud/bigquery/_pandas_helpers.py", line 151, in <module>
pyarrow.decimal256(76, scale=38).id: "BIGNUMERIC",
AttributeError: module 'pyarrow' has no attribute 'decimal256'
Run Code Online (Sandbox Code Playgroud) 我有一个熊猫数据框 df:
<bound method NDFrame.head of DAT_RUN DAT_FORECAST LIB_SOURCE MES_LONGITUDE MES_LATITUDE MES_TEMPERATURE MES_HUMIDITE MES_PLUIE MES_VITESSE_VENT MES_U_WIND MES_V_WIND
0 2022-03-29T00:00:00Z 2022-03-29T01:00:00Z gfs_025 43.50 3.75 11.994824 72.0 0.0 2.653137 -2.402910 -1.124792
1 2022-03-29T00:00:00Z 2022-03-29T01:00:00Z gfs_025 43.50 4.00 13.094824 74.3 0.0 2.976434 -2.972910 -0.144792
2 2022-03-29T00:00:00Z 2022-03-29T01:00:00Z gfs_025 43.50 4.25 12.594824 75.3 0.0 3.128418 -2.702910 1.575208
3 2022-03-29T00:00:00Z 2022-03-29T01:00:00Z gfs_025 43.50 4.50 12.094824 75.5 0.0 3.183418 -2.342910 2.155208
Run Code Online (Sandbox Code Playgroud)
我将 DAT_RUN 和 DAT_FORECAST 列转换为日期时间格式:
df["DAT_RUN"] = pd.to_datetime(df['DAT_RUN'], format="%Y-%m-%dT%H:%M:%SZ") # previously "%Y-%m-%d %H:%M:%S"
df["DAT_FORECAST"] = …Run Code Online (Sandbox Code Playgroud) .csv我尝试读取多个文件arrow::open_dataset(),但由于列类型不一致而引发错误。
我发现这个问题主要与我的问题有关,但我正在尝试一种稍微不同的方法。
我想使用arrow一个示例 CSV 文件来利用类型的自动检测。弄清楚所有类型的列非常耗时。
然后,我采用架构并更正一些导致问题的列。
然后我使用更新后的架构来读取所有文件。
以下是我的方法:
data = read_csv_arrow('data.csv.gz', as_data_frame = F) # has more than 30 columns
sch = data$schema
print(sch)
Run Code Online (Sandbox Code Playgroud)
Schema
trade_id: int64
secid: int64
side: int64
...
nonstd: int64
flags: string
Run Code Online (Sandbox Code Playgroud)
我想将'trade_id'列类型从int64更改为string并将其他列保持不变。
如何更新架构?
我正在使用 R arrow,但我想相关的答案pyarrow可能适用。
我正在尝试使用 arrow-cpp 构建一个表,然后将其传输回 python。
为了做到这一点,我需要事先调用 arrow::py::import_pyarrow() ,但这会导致 SEGFAULT。
谁能帮我找出我哪里做错了?
这是一个最小的例子
cmake_minimum_required(VERSION 3.20.0)
project(TEST)
set(CMAKE_CXX_STANDARD 17)
set(Python3_EXECUTABLE "/home/auderson/miniconda3/bin/python3.8")
list(APPEND CMAKE_PREFIX_PATH "/home/auderson/miniconda3/lib/cmake/arrow")
find_package(Arrow REQUIRED)
find_package(ArrowPython REQUIRED)
find_package(Python3 COMPONENTS Interpreter Development)
include_directories(.
/home/auderson/miniconda3/lib/python3.8/site-packages/pyarrow/include
${Python3_INCLUDE_DIRS})
add_executable(TEST
mini_t.cpp
)
target_link_libraries(${PROJECT_NAME} PRIVATE arrow_shared)
target_link_libraries(${PROJECT_NAME} PRIVATE arrow_python_shared)
target_link_libraries(${PROJECT_NAME} PRIVATE ${Python3_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
#include "arrow/python/pyarrow.h"
int main() {
return arrow::py::import_pyarrow();
}
Run Code Online (Sandbox Code Playgroud)
Signal: SIGSEGV (Segmentation fault)
Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)
如果不在调试模式:
Process finished with exit code 139
Run Code Online (Sandbox Code Playgroud)
箭头的其他功能工作得很好。
对于不断增加的数据库来说,Arrow 的数据集功能是一个很好的工具,即使数据被分区和压缩,人们也希望不断向其中添加更多数据。我已经能够成功地将数据分区到列中,从而使过滤和查询速度更快。但是 Arrow 是否允许按行组进行分区?
文档没有详细解释这一点,我的目标是按行分区,然后能够查询这些分区的元数据[最高值,最低值]。箭允许这样做吗?
到目前为止我已经尝试过片段
fragments = list(dataset.get_fragments())
fragments[0].split_by_row_group()
Run Code Online (Sandbox Code Playgroud)
然而,这只是给我返回由列分区创建的文件夹结构中的文件。
pyarrow ×10
python ×5
apache-arrow ×3
parquet ×3
c++ ×1
csv ×1
dask ×1
docker ×1
fastparquet ×1
kubernetes ×1
pandas ×1
pyspark ×1
python-3.x ×1
r ×1