在pyarrow 中,将 a pyarrow.Tensor(例如从 a 创建numpy.ndarray)写入 Parquet 文件的建议方法是什么?甚至有可能无需通过pyarrow.Tableandpandas.DataFrame吗?
我想将其中某些列是字符串数组或结构数组(通常是键值对)的数据写入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) 我想将一个大的 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) 我正在尝试使用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吗?
我正在使用 Pyarrow 库来优化 Pandas DataFrame 的存储。我需要尽可能快地逐行处理 pyarrow Table 而不将其转换为 Pandas DataFrame(它不适合内存)。Pandas 有 iterrows()/iterrtuples() 方法。除了 for 循环和索引寻址之外,是否有任何快速迭代 Pyarrow Table 的方法?
我正在将大型 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)
结果DataFrame用objectdtypes 代替了所需的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.
我想使用 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) 我正在编写一个向 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) 我正在尝试 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 …
我正在尝试从 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。
pyarrow ×10
pandas ×6
parquet ×5
python ×4
numpy ×2
python-3.x ×2
apache-spark ×1
cmake ×1
csv ×1
dataframe ×1
fastparquet ×1
pyspark ×1
tensor ×1