我在S3存储桶中以CSV格式存储了多个非常大的数据集。我需要将这些CSV转换为Apache Parquet文件。
我没有(也不想要)任何Spark集群,所以如果我错了,请纠正我,但是在我看来pyspark
毫无帮助。
基本上,我想从迭代器逐行流式传输CSV,我想根据模式生成Parquet文件。
据我了解,pyarrow
不能在输入中使用迭代器。
有人有解决的办法吗?
任何帮助表示赞赏!
答案 0 :(得分:1)
Spark可以在本地运行,例如通过安装pip install pyspark
并在本地jupyter笔记本中运行代码。
spark = SparkSession.builder\
.master("local[*]").appName("csvConverter")\
.config("spark.sql.shuffle.partitions", 8)\
.getOrCreate()
以上初始化操作会将spark设置为以本地模式运行,并使用尽可能多的内核。
通过本地运行的spark会话,您可以使用spark的并行处理功能轻松加载所有csv,这应比从文件逐行流式传输要快得多。
df = spark.read.format("csv") \
.option("inferSchema", "true") \
.option("header", "true") \
.schema(table_schema) \
.load("./data/*.csv")
有一些用于从S3读取数据的库。
要保存加载的数据,您可以轻松地将其写入镶木地板
df.write.parquet("output.parquet")
这就是全部。
如果您不想自己创建集群,请查看Databricks。在Databricks中,创建群集几乎是一键操作,您可以在Azure或AWS上使用它们(Azure提供200USD free trial可以使用)。最重要的是,Databricks提供了一个免费社区版本,其中包含6GB的内存群集- you can learn more here
答案 1 :(得分:0)
这是读取csv数据,然后将其写入镶木表的代码段示例。这是pandas
单机方法,不通过spark
利用分布式方法。希望这会有所帮助。
本文为您的迭代批处理用例提供了一些不错的示例:
https://wesmckinney.com/blog/arrow-streaming-columnar/
import pandas as pd
import numpy as np
import pyarrow as pa
import pyarrow.parquet as pq
PATH = "s3://..."
df = pd.read_csv(PATH, sep="\t")
df.head()
c1 c2 c3
0 1 2 3
1 4 5 6
2 7 8 9
parquet_table = pa.Table.from_pandas(df, preserve_index=False)
pq.write_table(parquet_table, './df.parquet') # target path
! ls ./df.parquet
./df.parquet # list of parquet files
pandas_table = pq.read_table('./df.parquet') # confirm write worked
pandas_table.to_pandas() # data
c1 c2 c3
0 1 2 3
1 4 5 6
2 7 8 9