簡體   English   中英

使用 python 將 csv 轉換為 parquet 文件

[英]Convert csv to parquet file using python

我正在嘗試將 a.csv 文件轉換為 a.parquet 文件。
csv 文件 ( Temp.csv ) 具有以下格式

1,Jon,Doe,Denver

我正在使用以下 python 代碼將其轉換為鑲木地板

from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *
import os

if __name__ == "__main__":
    sc = SparkContext(appName="CSV2Parquet")
    sqlContext = SQLContext(sc)

    schema = StructType([
            StructField("col1", IntegerType(), True),
            StructField("col2", StringType(), True),
            StructField("col3", StringType(), True),
            StructField("col4", StringType(), True)])
    dirname = os.path.dirname(os.path.abspath(__file__))
    csvfilename = os.path.join(dirname,'Temp.csv')    
    rdd = sc.textFile(csvfilename).map(lambda line: line.split(","))
    df = sqlContext.createDataFrame(rdd, schema)
    parquetfilename = os.path.join(dirname,'output.parquet')    
    df.write.mode('overwrite').parquet(parquetfilename)

結果只有一個名為output.parquet的文件夾,而不是我正在尋找的 parquet 文件,然后在控制台上出現以下錯誤。

CSV 到 Parquet 錯誤

我還嘗試運行以下代碼來面對類似的問題。

from pyspark.sql import SparkSession
import os

spark = SparkSession \
    .builder \
    .appName("Protob Conversion to Parquet") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()

# read csv
dirname = os.path.dirname(os.path.abspath(__file__))
csvfilename = os.path.join(dirname,'Temp.csv')    
df = spark.read.csv(csvfilename)

# Displays the content of the DataFrame to stdout
df.show()
parquetfilename = os.path.join(dirname,'output.parquet')    
df.write.mode('overwrite').parquet(parquetfilename)

如何最好地做到這一點? 使用 windows、python 2.7。

使用pyarrowpandas包,您可以將 CSV 轉換為 Parquet,而無需在后台使用 JVM:

import pandas as pd
df = pd.read_csv('example.csv')
df.to_parquet('output.parquet')

您將運行的一個限制是pyarrow僅適用於 Windows 上的 Python 3.5+。 要么使用 Linux/OSX 將代碼作為 Python 2 運行,要么將您的 Windows 設置升級到 Python 3.6。

您可以僅使用 pyarrow 將 csv 轉換為鑲木地板 - 沒有熊貓。 當您需要最小化代碼依賴項(例如使用 AWS Lambda)時,它可能很有用。

import pyarrow.csv as pv
import pyarrow.parquet as pq

table = pv.read_csv(filename)
pq.write_table(table, filename.replace('csv', 'parquet'))

請參閱 pyarrow 文檔以微調read_csvwrite_table函數。

import boto3
import pandas as pd
import pyarrow as pa
from s3fs import S3FileSystem
import pyarrow.parquet as pq

s3 = boto3.client('s3',region_name='us-east-2')
obj = s3.get_object(Bucket='ssiworkoutput', Key='file_Folder/File_Name.csv')
df = pd.read_csv(obj['Body'])

table = pa.Table.from_pandas(df)

output_file = "s3://ssiworkoutput/file/output.parquet"  # S3 Path need to mention
s3 = S3FileSystem()

pq.write_to_dataset(table=table,
                    root_path=output_file,partition_cols=['Year','Month'],
                    filesystem=s3)

print("File converted from CSV to parquet completed")

有幾種不同的方法可以使用 Python 將 CSV 文件轉換為 Parquet。

Uwe L. Korn 的 Pandas 方法非常有效。

如果您想將多個 CSV 文件轉換為多個 Parquet/單個 Parquet 文件,請使用 Dask。 這會將多個 CSV 文件轉換為兩個 Parquet 文件:

import dask.dataframe as dd

df = dd.read_csv('./data/people/*.csv')
df = df.repartition(npartitions=4)
df.to_parquet('./tmp/people_parquet4')

如果您只想輸出一個 Parquet 文件,也可以使用df.repartition(npartitions=1) 有關使用 Dask 將 CSV 轉換為 Parquet 的更多信息 [此處][1]。

這是在 Spark 環境中工作的 PySpark 片段:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
  .master("local") \
  .appName("parquet_example") \
  .getOrCreate()

df = spark.read.csv('data/us_presidents.csv', header = True)
df.repartition(1).write.mode('overwrite').parquet('tmp/pyspark_us_presidents')

您還可以在 Spark 環境中使用Koalas

import databricks.koalas as ks

df = ks.read_csv('data/us_presidents.csv')
df.to_parquet('tmp/koala_us_presidents')

處理大於 memory CSV 的文件

下面的代碼將 CSV 轉換為 Parquet,而無需將整個 csv 文件加載到 memory

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

new_schema = pa.schema([
    ('col1', pa.int64()),
    ('col2', pa.int64()),
    ('newcol', pa.int64())
])

csv_column_list = ['col1', 'col2']

with pq.ParquetWriter('my_parq_data.parquet', schema=new_schema) as writer:
    with pd.read_csv('my_data.csv', header=None, names=csv_column_list, chunksize=100000) as reader:
        for df in reader:
            # transformation: transform df by adding a new static column with column name 'newcol' and value 9999999
            df['newcol'] = 9999999
            # convert pandas df to record batch
            transformed_batch = pa.RecordBatch.from_pandas(df, schema=new_schema)
            writer.write_batch(transformed_batch)  

以上代碼:

  1. 分塊讀取 CSV 大文件
  2. 通過添加新列來轉換數據框。
  3. 將 df 轉換為箭頭記錄 batch
  4. 將轉換后的箭頭批次作為新行組寫入 parquet 文件。

注意:不要將塊大小保持得很低。 這將導致壓縮效果不佳,因為塊大小也對應於新鑲木地板文件中的行組大小。

您可以使用spark將其編寫為 PARQUET FILE:

spark = SparkSession.builder.appName("Test_Parquet").master("local[*]").getOrCreate()

parquetDF = spark.read.csv("data.csv")

parquetDF.coalesce(1).write.mode("overwrite").parquet("Parquet")

我希望這有幫助

from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *
import sys

sc = SparkContext(appName="CSV2Parquet")
sqlContext = SQLContext(sc)

schema = StructType([
    StructField("col1", StringType(), True),
    StructField("col2", StringType(), True),
    StructField("col3", StringType(), True),
    StructField("col4", StringType(), True),
    StructField("col5", StringType(), True)])
rdd = sc.textFile('/input.csv').map(lambda line: line.split(","))
df = sqlContext.createDataFrame(rdd, schema)
df.write.parquet('/output.parquet')

您可以使用 pyspark 庫將 CSV 文件轉換為 Parquet 文件。 以下是如何執行此操作的示例:

rc = spark.read.csv('/path/file.csv', header=True)
rc.write.format("parquet").save('/path/file.parquet')

此代碼讀取 CSV 文件並將其轉換為 Parquet 文件。

這對我有幫助。

import pandas as pd
df = pd.read_csv('example.csv', low_memory=False)
df.to_parquet('output.parquet', engine="fastparquet")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM