我正在尝试通过 Pyarrow 连接到 HDFS,但它不起作用,因为libhdfs无法加载库。
libhdfs.so既在 又$HADOOP_HOME/lib/native在$ARROW_LIBHDFS_DIR。
print(os.environ['ARROW_LIBHDFS_DIR'])
fs = hdfs.connect()
bash-3.2$ ls $ARROW_LIBHDFS_DIR
examples libhadoop.so.1.0.0 libhdfs.a libnativetask.a
libhadoop.a libhadooppipes.a libhdfs.so libnativetask.so
libhadoop.so libhadooputils.a libhdfs.so.0.0.0 libnativetask.so.1.0.0
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
Traceback (most recent call last):
File "wine-pred-ml.py", line 31, in <module>
fs = hdfs.connect()
File "/Users/PVZP/Library/Python/2.7/lib/python/site-packages/pyarrow/hdfs.py", line 183, in connect
extra_conf=extra_conf)
File "/Users/PVZP/Library/Python/2.7/lib/python/site-packages/pyarrow/hdfs.py", line 37, in __init__
self._connect(host, port, user, kerb_ticket, driver, extra_conf)
File "pyarrow/io-hdfs.pxi", line 89, in pyarrow.lib.HadoopFileSystem._connect
File "pyarrow/error.pxi", line 83, in pyarrow.lib.check_status
pyarrow.lib.ArrowIOError: Unable …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 Python Pandas DataFrame 存储为 Parquet 文件,但遇到了一些问题。我的 Pandas DF 的一列包含这样的字典:
import pandas as pandas
df = pd.DataFrame({
"ColA": [1, 2, 3],
"ColB": ["X", "Y", "Z"],
"ColC": [
{ "Field": "Value" },
{ "Field": "Value2" },
{ "Field": "Value3" }
]
})
df.to_parquet("test.parquet")
Run Code Online (Sandbox Code Playgroud)
现在,这工作得很好,问题是当字典的嵌套值之一具有与其他值不同的类型时。例如:
import pandas as pandas
df = pd.DataFrame({
"ColA": [1, 2, 3],
"ColB": ["X", "Y", "Z"],
"ColC": [
{ "Field": "Value" },
{ "Field": "Value2" },
{ "Field": ["Value3"] }
]
})
df.to_parquet("test.parquet")
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误:
ArrowInvalid: ('cannot mix list …
我尝试在终端和 juypter 实验室中安装它,它说它已成功安装,但是当我运行 df = query_job.to_dataframe() 时,我不断收到错误“ ValueError: The pyarrow library is not installed, please install pyarrow使用 to_arrow() 函数。”。我不知道如何解决这个问题。有什么建议吗?我试图最终使用代码从谷歌数据工作室访问数据,
from google.cloud import bigquery
import pandas
import numpy
import pyarrow
bigquery_client = bigquery.Client()
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] ='full file path here.json'
QUERY = """
SELECT *
FROM `warehouse`
LIMIT 100
"""
query_job = bigquery_client.query(QUERY)
df = query_job.to_dataframe()
Run Code Online (Sandbox Code Playgroud) 我似乎无法通过 pyarrow 将包含 timedeltas 的 Pandas 数据帧写入镶木地板文件。
该pyarrow文档指定它可以处理numpy的timedeltas64与ms精确度。但是,当我从 numpy 构建数据框时timedelta64[ms],该列的数据类型是timedelta64[ns].
Pyarrow 然后因此引发错误。
这是熊猫或pyarrow中的错误吗?有没有简单的解决方法?
以下代码:
df = pd.DataFrame({
'timedelta': np.arange(start=0, stop=1000,
step=10,
dtype='timedelta64[ms]')
})
print(df.timedelta.dtypes)
df.to_parquet('test.parquet', engine='pyarrow', compression='gzip')
Run Code Online (Sandbox Code Playgroud)
产生以下输出:timedelta64[ns]和错误:
---------------------------------------------------------------------------
ArrowNotImplementedError Traceback (most recent call last)
<ipython-input-41-7df28b306c1e> in <module>()
3 step=10,
4 dtype='timedelta64[ms]')
----> 5 }).to_parquet('test.parquet', engine='pyarrow', compression='gzip')
~/miniconda3/envs/myenv/lib/python3.6/site-packages/pandas/core/frame.py in to_parquet(self, fname, engine, compression, **kwargs)
1940 from pandas.io.parquet import to_parquet
1941 to_parquet(self, fname, engine,
-> 1942 compression=compression, **kwargs)
1943
1944 @Substitution(header='Write …Run Code Online (Sandbox Code Playgroud) 我有羽毛格式文件sales.fea,我用它来交换python和R 之间的数据.
在RI中使用以下命令:
df = as.data.frame(feather::read_feather("sales.fea"))
Run Code Online (Sandbox Code Playgroud)
在python我用过:
df = feather.read_dataframe("sales.fea")
Run Code Online (Sandbox Code Playgroud)
将数据从该文件加载到内存到Spark实例的最快/最佳方法是什么pyspark?
我不想使用pandas来加载数据,因为它是我的19GB羽毛文件的段错误,由45GB csv创建.
我的想法是,Spark是如此时髦,也是羽毛,我希望有一些更本土化的方式,而不是通过次高效的临时解决方案.
我有一个很大的字典,我想遍历它来构建一个 pyarrow 表。字典的值是不同类型的元组,需要解包并存储在最终 pyarrow 表中的单独列中。我确实提前知道架构。键还需要存储为列。我在下面有一种方法可以逐行构建表格 - 还有另一种更快的方法吗?对于上下文,我想将一个大字典解析为一个 pyarrow 表以写出到镶木地板文件中。RAM 使用比 CPU 时间更重要。我不想下降到箭头 C++ API。
import pyarrow as pa
import random
import string
import time
large_dict = dict()
for i in range(int(1e6)):
large_dict[i] = (random.randint(0, 5), random.choice(string.ascii_letters))
schema = pa.schema({
"key" : pa.uint32(),
"col1" : pa.uint8(),
"col2" : pa.string()
})
start = time.time()
tables = []
for key, item in large_dict.items():
val1, val2 = item
tables.append(
pa.Table.from_pydict({
"key" : [key],
"col1" : [val1],
"col2" : [val2]
}, schema = schema)
) …Run Code Online (Sandbox Code Playgroud) 我有一个包含许多列(压缩)JSON 格式的大型数据集。我正在尝试将其转换为镶木地板以进行后续处理。某些列具有嵌套结构。现在我想忽略这个结构,只是将这些列作为(JSON)字符串写出来。
所以对于我确定的列,我正在做:
df[column] = df[column].astype(str)
Run Code Online (Sandbox Code Playgroud)
但是,我不确定哪些列是嵌套的,哪些不是。当我用镶木地板书写时,我看到以下消息:
<stack trace redacted>
File "pyarrow/_parquet.pyx", line 1375, in pyarrow._parquet.ParquetWriter.write_table
File "pyarrow/error.pxi", line 78, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: Nested column branch had multiple children: struct<coordinates: list<item: double>, type: string>
Run Code Online (Sandbox Code Playgroud)
这表明我未能将我的一列从嵌套对象转换为字符串。但应该归咎于哪个专栏?我怎么知道?
当我打印.dtypes我的 Pandas 数据框时,我无法区分字符串和嵌套值,因为两者都显示为object.
编辑:该错误通过显示结构详细信息提示了嵌套列,但这非常耗时调试。此外,它只打印第一个错误,如果您有多个嵌套列,这可能会很烦人
在数据集中,我有 5000000 行,我想在我的数据集中添加一个名为“嵌入”的列。
dataset = dataset.add_column('embeddings', embeddings)
变量embeddings是一个大小为 (5000000, 512) 的 numpy memmap 数组。
但我收到这个错误:
ArrowInvalidTraceback(最近一次调用最后一次)位于 ----> 1 dataset = dataset.add_column('embeddings', embeddings)
/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py inwrapper(*args, **kwargs) 486 } 487 # 应用实际函数 --> 488 out: Union["Dataset", " DatasetDict"] = func(self, *args, **kwargs) 489 数据集: List["Dataset"] = list(out.values()) if isinstance(out, dict) else [out] 490 # 重新应用格式到输出
/opt/conda/lib/python3.8/site-packages/datasets/fingerprint.py inwrapper(*args, **kwargs) 404 # 调用实际函数 405 --> 406 out = func(self, *args, * *kwargs) 407 408 # 更新就地变换的指纹+更新就地变换的历史记录
/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py in add_column(self, name, column, new_fingerprint) …
我的 S3 存储桶中存储了一个镶木地板数据集,其中包含多个分区文件。我想将其读入我的 pandas 数据帧,但是当我以前没有这样做时,我收到了这个 ArrowInvalid 错误。
有时,这些数据会被之前的 pandas 数据快照覆盖,如下所示:
import pandas as pd # version 1.3.4
# pyarrow version 5.0
df.to_parquet(
f's3a://{bucket_and_prefix}',
storage_options={
"key" : os.getenv("AWS_ACCESS_KEY_ID"),
"secret" : os.getenv("AWS_SECRET_ACCESS_KEY"),
"client_kwargs": {
'verify' : os.getenv('AWS_CA_BUNDLE'),
'endpoint_url': 'https://prd-data.company.com/'
}
},
index=False
)
Run Code Online (Sandbox Code Playgroud)
但是当阅读它时:
df = pd.read_parquet(
f"s3a://{bucket_and_prefix}",
storage_options={
"key" : os.getenv("AWS_ACCESS_KEY_ID"),
"secret" : os.getenv("AWS_SECRET_ACCESS_KEY"),
"client_kwargs": {
'verify' : os.getenv('AWS_CA_BUNDLE'),
'endpoint_url': 'https://prd-data.company.com/'
}
}
)
Run Code Online (Sandbox Code Playgroud)
它失败并出现错误:
ArrowInvalid:GetFileInfo() 产生路径“bucket/folder/data.parquet/year=2021/month=2/abcde.parquet”,位于基本目录“s3://bucket/folder/data.parquet”之外
知道为什么会发生这个 ArrowInvalid 错误以及如何将镶木地板数据读入 pandas 吗?
Pyarrow 将在 pandas 的下一个主要版本(pandas 3.0)中成为 pandas 的必需依赖项
-每次我在 PyCharm 上执行“import pandas as pd”时都会出现此错误
给我解决方案我应该安装或升级什么。
pyarrow ×10
python ×8
pandas ×5
parquet ×3
apache-arrow ×2
apache-spark ×1
dataframe ×1
feather ×1
hadoop ×1
hdfs ×1
import ×1
jupyter ×1
numpy ×1
pyspark ×1
python-3.x ×1