在Python中即时从CSV生成实木复合地板

时间:2019-09-12 16:08:24

标签: python python-3.x pyspark parquet pyarrow

我在S3存储桶中以CSV格式存储了多个非常大的数据集。我需要将这些CSV转换为Apache Parquet文件。

我没有(也不想要)任何Spark集群,所以如果我错了,请纠正我,但是在我看来pyspark毫无帮助。

基本上,我想从迭代器逐行流式传输CSV,我想根据模式生成Parquet文件。 据我了解,pyarrow不能在输入中使用迭代器。

有人有解决的办法吗?

任何帮助表示赞赏!

2 个答案:

答案 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