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?
Ici est un exemple de code qui le fait dans les deux sens.
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 ) .
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 !
Utiliser pip
:
pip install pandas pyarrow
ou en utilisant conda
:
conda install pandas pyarrow -c conda-forge
# 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!).
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")
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
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")
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')