我正在尝试将.csv文件转换为.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
的文件夹,而不是我正在寻找的镶木地板文件,然后在控制台上出现以下错误。
我还尝试运行以下代码来面对类似的问题。
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。
答案 0 :(得分:14)
使用包pyarrow
和pandas
,您可以在不使用后台JVM的情况下将CSV转换为Parquet:
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。
答案 1 :(得分:7)
您只能使用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_csv
和write_table
函数。
答案 2 :(得分:4)
有几种方法可以使用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 here将CSV转换为Parquet的更多信息。
以下是在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')
阅读this blog post了解更多信息。
答案 3 :(得分:0)
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")
答案 4 :(得分:0)
您可以使用火花将其写为PARQUET文件:
spark = SparkSession.builder.appName("Test_Parquet").master("local[*]").getOrCreate()
parquetDF = spark.read.csv("data.csv")
parquetDF.coalesce(1).write.mode("overwrite").parquet("Parquet")
我希望这对您有帮助
答案 5 :(得分:0)
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')