web-dev-qa-db-fra.com

Convertissez csv en fichier parquet en utilisant python

J'essaie de convertir un fichier .csv en un fichier .parquet.
Le fichier csv (Temp.csv) a le format suivant

1,Jon,Doe,Denver

J'utilise le code python suivant pour le convertir en parquet

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)

Le résultat est uniquement un dossier nommé, output.parquet et non un fichier de parquet que je recherche, suivi de l’erreur suivante sur la console.

CSV to Parquet Error

J'ai également essayé d'exécuter le code suivant pour faire face à un problème similaire.

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)

Comment le mieux faire? En utilisant windows, python 2.7.

17

En utilisant les packages pyarrow et pandas, vous pouvez convertir des CSV en Parquet sans utiliser de machine virtuelle en arrière-plan:

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

Une limitation dans laquelle vous allez exécuter est que pyarrow est uniquement disponible pour Python 3.5+ sous Windows. Utilisez soit Linux/OSX pour exécuter le code ainsi Python 2 ou mettez à niveau votre configuration Windows vers Python 3.6.

17
Uwe L. Korn
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")
2
Amol More