web-dev-qa-db-fra.com

Comment convertir un fichier csv en parquet

BigData est nouveau pour moi. Je dois convertir un fichier csv/txt au format Parquet. J'ai cherché beaucoup mais je n'ai pas trouvé de moyen direct de le faire. Y a-t-il un moyen d'y parvenir?

16
author243

Ici est un exemple de code qui le fait dans les deux sens.

10
Pratik Khadloya

Vous pouvez utiliser Apache Drill , comme décrit dans Convertir un fichier CSV en Apache Parquet With Drill .

En bref:

Démarrez Apache Drill:

 $ cd /opt/drill/bin
$ sqlline -u jdbc: drill: zk = local 

Créez le fichier Parquet:

-- Définir le format de table par défaut sur parquet 
 ALTER SESSION SET 'store.format` =' parquet '; 

-- Créez une table de parquet contenant toutes les données de la table CSV 
 CREATE TABLEAU dfs.tmp.`/stats/airport_data/`AS 
 SELECT 
 CAST (SUBSTR (colonnes [0], 1,4) AS INT)` YEAR`, 
 CAST (SUBSTR (colonnes [0 ], 5,2) AS INT) `MOIS`, 
 Colonnes [1] comme` AIRLINE`, 
 Colonnes [2] comme `IATA_CODE`, 
 Colonnes [3] comme` AIRLINE_2` ,
 columns [4] comme `IATA_CODE_2`, 
 columns [5] comme` GEO_SUMMARY`, 
 columns [6] comme `GEO_REGION`, 
 columns [7] comme` ACTIVITY_CODE`, 
 Colonnes [8] comme `PRICE_CODE`, 
 Colonnes [9] comme` TERMINAL`, 
 Colonnes [10] comme `BOARDING_AREA`, 
 CAST (colonnes [11] AS DOUBLE) comme` PASSENGER_COUNT`
 FROM dfs.`/opendata/Passenger/SFO_Passenger_Data/*. Csv`; 

Essayez de sélectionner des données dans le nouveau fichier Parquet:

-- Sélectionnez les données de la table de parquet
SELECT * 
 FROM dfs.tmp.`/stats/airport_data/* `

Vous pouvez changer l'emplacement dfs.tmp en allant à http://localhost:8047/storage/dfs (source: CSV et Parquet ) .

11
ostrokach

J'ai déjà posté une réponse sur la façon de le faire avec Apache Drill. Cependant, si vous connaissez Python, vous pouvez maintenant le faire en utilisant Pandas et PyArrow !

Installer des dépendances

Utiliser pip:

pip install pandas pyarrow

ou en utilisant conda:

conda install pandas pyarrow -c conda-forge

Conversion de CSV en Parquet en morceaux

# csv_to_parquet.py

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

csv_file = '/path/to/my.tsv'
chunksize = 100_000

csv_stream = pd.read_csv(csv_file, sep='\t', chunksize=chunksize, low_memory=False)

for i, chunk in enumerate(csv_stream):
    print("Chunk", i)
    if i == 0:
        # Guess the schema of the CSV file from the first chunk
        parquet_schema = pa.Table.from_pandas(df=chunk).schema
        # Open a Parquet file for writing
        parquet_writer = pq.ParquetWriter(parquet_file, parquet_schema, compression='snappy')
    # Write CSV chunk to the parquet file
    table = pa.Table.from_pandas(chunk, schema=parquet_schema)
    parquet_writer.write_table(table)

parquet_writer.close()

Je n'ai pas comparé ce code à la version d'Apache Drill, mais d'après mon expérience, la conversion est très rapide: des dizaines de milliers de lignes par seconde (cela dépend du fichier CSV bien sûr!).

7
ostrokach

Le code suivant est un exemple utilisant spark2.0. La lecture est beaucoup plus rapide que l'option inferSchema. Spark 2.0 convertit le fichier de parquet en beaucoup plus efficace que spark1.6.

import org.Apache.spark.sql.types._
var df = StructType(Array(StructField("timestamp", StringType, true),StructField("site", StringType, true),StructField("requests", LongType, true) ))
df = spark.read
          .schema(df)
          .option("header", "true")
          .option("delimiter", "\t")
          .csv("/user/hduser/wikipedia/pageviews-by-second-tsv")
df.write.parquet("/user/hduser/wikipedia/pageviews-by-second-parquet")
4
Madhu Kiran Seelam

1) Vous pouvez créer une table Hive externe

create  external table emp(name string,job_title string,department string,salary_per_year int)
row format delimited
fields terminated by ','
location '.. hdfs location of csv file '

2) Une autre table de ruche qui stockera le dossier de parquet

create  external table emp_par(name string,job_title string,department string,salary_per_year int)
row format delimited
stored as PARQUET
location 'hdfs location were you want the save parquet file'

Insérez les données de la table une dans la table deux:

insert overwrite table emp_par select * from emp 
2
Hemant Kumar

Lisez les fichiers csv en tant que Dataframe dans Apache Spark avec package spark-csv . après le chargement des données dans Dataframe, sauvegardez dataframe dans parquetfile.

val df = sqlContext.read
      .format("com.databricks.spark.csv")
      .option("header", "true")
      .option("inferSchema", "true")
      .option("mode", "DROPMALFORMED")
      .load("/home/myuser/data/log/*.csv")
df.saveAsParquetFile("/home/myuser/data.parquet")
1
Milad Khajavi
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')
0
Shuli Hakim