如何在Python中将JSON结果转换为Parquet?

19

按照下面的脚本将JSON文件转换为Parquet格式。我使用pandas库执行转换。然而,出现了以下错误:AttributeError: 'DataFrame' object has no attribute 'schema'。我对Python仍不是很熟悉。

这是我正在使用的原始JSON文件: [ { "a": "01", "b": "teste01" }, { "a": "02", "b": "teste02" } ]

我做错了什么?

import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.read_json('C:/python/json_teste')

pq = pa.parquet.write_table(df, 'C:/python/parquet_teste')

错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-23-1b4ced833098> in <module>
----> 1 pq = pa.parquet.write_table(df, 'C:/python/parquet_teste')

C:\Anaconda\lib\site-packages\pyarrow\parquet.py in write_table(table, where, row_group_size, version, use_dictionary, compression, write_statistics, use_deprecated_int96_timestamps, coerce_timestamps, allow_truncated_timestamps, data_page_size, flavor, filesystem, **kwargs)
   1256     try:
   1257         with ParquetWriter(
-> 1258                 where, table.schema,
   1259                 filesystem=filesystem,
   1260                 version=version,

C:\Anaconda\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   5065             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5066                 return self[name]
-> 5067             return object.__getattribute__(self, name)
   5068 
   5069     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'schema'

打印文件:

#print 
print(df)
   a        b
0  1  teste01
1  2  teste02

#following columns
df.columns
Index(['a', 'b'], dtype='object')

#following types
df.dtypes
a     int64
b    object
dtype: object
5个回答

6
您可以直接使用 pyarrow 来读取JSON文件,示例如下:
from pyarrow import json
import pyarrow.parquet as pq

table = json.read_json('C:/python/json_teste') 
pq.write_table(table, 'C:/python/result.parquet')  # save json/table as parquet

参考资料:使用pyarrow.parquet进行读写操作


5

您可以通过以下方式使用Pyspark实现您想要的功能:

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("JsonToParquetPysparkExample") \
    .getOrCreate()

json_df = spark.read.json("C://python/test.json", multiLine=True,) 
json_df.printSchema()
json_df.write.parquet("C://python/output.parquet")

你需要为此设置一个Spark集群吗? - sam

4
如果您的目的仅是将json转换为parquet格式,您可以使用pyspark API:
>>> data = [ { "a": "01", "b": "teste01" }, { "a": "02", "b": "teste02" } ]
>>> df = spark.createDataFrame(data)
>>> df.write.parquet("data.parquet")

现在,这个DF是一个Spark数据框架,可以保存为Parquet格式。


我导入了pyspark脚本,但在执行此脚本时出现以下错误:AttributeError: module 'pyspark' has no attribute 'createDataFrame'。 - Mateus Silvestre
你需要启动一个 PySpark shell 来测试这个。createDataFrame 是 Spark 上的一个方法,它默认在 PySpark shell 中可用。 - Hussain Bohra
感谢您的反馈。但是我开始了一个Pyapark shell测试,又遇到了这个错误。我正在使用Jupyter笔记本。请看代码: import pyspark data = [ { "a": "01", "b": "teste01" }, { "a": "02", "b": "teste02" } ] df = spark.createDataFrame(data) df.write.parquet("data.parquet") - Mateus Silvestre
你使用的是哪个版本的Pyspark?我相信spark.createDataFrame从2.3.0版本开始可用,请查看此文档https://spark.apache.org/docs/2.3.0/sql-programming-guide.html#programmatically-specifying-the-schema - Hussain Bohra
@MateusSilvestre 我已经为你的请求提供了一个完整的示例,请看看它是否可行。 - Felix K Jose
显示剩余2条评论

3

以下是使用Python中的Pandas将JSON文件转换为Apache Parquet格式的方法。这是一种使用众所周知的库进行的简单方法。

首先,请确保安装了pandaspyarrow。如果您正在使用Anaconda的Python

conda install pandas
conda install pyarrow

然后,这里是代码:
import pandas as pd
data = pd.read_json(FILEPATH_TO_JSON_FILE)
data.to_parquet(PATH_WHERE_TO_SAVE_PARQUET_FILE)

我希望这能对您有所帮助,如果您需要澄清任何问题,请告诉我。

1
欢迎来到Stackoverflow,您正在使用的库显示,在示例中,您需要在数据框中编写列名。尝试使用数据框的列名,它将起作用。
# Given PyArrow schema
import pyarrow as pa
schema = pa.schema([
    pa.field('my_column', pa.string),
    pa.field('my_int', pa.int64),
])
convert_json(input_filename, output_filename, schema)

参考文献:json2parquet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接