java gzip 多个文件_并行化GZip文件处理Spark

我建议采用以下两种方法中的一种(实际上我发现第一种方法在性能方面给出了更好的结果) .

将每个Zip文件写入单独的Parquet文件

在这里你可以使用 pyarrow 将一个Parquet文件写入HDFS:

def convert_gzip_to_parquet(file_from, file_to):

gzipped_csv = read_gzip_file(file_from)

pyarrow_table = to_pyarrow_table(gzipped_csv)

hdfs_client = pyarrow.HdfsClient()

with hdfs_client.open(file_to, "wb") as f:

pyarrow.parquet.write_table(pyarrow_table, f)

# Filename RDD contains tuples with file_from and file_to

filenameRDD.map(lambda x: convert_gzip_to_parquet(x[0], x[1]))

有两种方法可以获取pyarrow.Table对象:

要么从pandas DataFrame中获取它(在这种情况下你也可以使用pandas的read_csv()函数): pyarrow_table = pyarrow.Table.from_pandas(pandas_df)

要使pyarrow使用HDFS,需要正确设置多个环境变量,请参阅here

将所有Zip-Files中的行连接到一个Parquet-File中

def get_rows_from_gzip(file_from):

rows = read_gzip_file(file_from)

return rows

# read the rows of each zip file into a Row object

rows_rdd = filenameRDD.map(lambda x: get_rows_from_gzip(x[0]))

# flatten list of lists

rows_rdd = rows_rdd.flatMap(lambda x: x)

# convert to DataFrame and write to Parquet

df = spark_session.create_DataFrame(rows_rdd)

df.write.parquet(file_to)

如果您事先知道数据的架构,则将架构对象传递给 create_DataFrame 将加速DataFrame的创建 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值