gpt4 book ai didi

csv - 在 Spark 中高效聚合多个 CSV

转载 作者:行者123 更新时间:2023-12-04 20:38:00 25 4
gpt4 key购买 nike

请原谅我的简单问题,但我对 Spark/Hadoop 比较陌生。

我正在尝试将一堆小型 CSV 文件加载到 Apache Spark 中。它们目前存储在 S3 中,但如果可以简化事情,我可以在本地下载它们。我的目标是尽可能高效地做到这一点。让一些单线程主下载和解析一堆 CSV 文件而我的几十个 Spark worker 无所事事,这似乎是一种耻辱。我希望有一种惯用的方式来分发这项工作。

CSV 文件按目录结构排列,如下所示:

2014/01-01/fileabcd.csv
2014/01-01/filedefg.csv
...

我有两年的数据,每天都有目录,每个目录中有几百个 CSV。所有这些 CSV 都应该具有相同的架构,但当然有可能一个 CSV 出错,如果有几个有问题的文件,我不希望整个工作崩溃。只要我在某处发生的日志中收到通知,就可以跳过这些文件。

好像我脑子里的每个Spark项目都是这个形式,不知道怎么解决。 (例如,尝试读取一堆制表符分隔的 weather data ,或读取一堆日志文件以查看它们。)

我试过的

我已经尝试过 SparkR 和 Scala 库。我真的不在乎我需要使用哪种语言;我对要使用的正确习语/工具更感兴趣。

纯 Scala

我原来的想法是枚举和 parallelize所有列表 year/mm-dd组合,以便我可以让我的 Spark 工作人员每天都独立处理(下载并解析所有 CSV 文件,然后将它们堆叠在一起( unionAll() )以减少它们)。不幸的是,使用 spark-csv 下载和解析 CSV 文件库只能在“父”/主作业中完成,而不是从每个 child 中完成 Spark doesn't allow job nesting .因此,只要我想使用 Spark 库进行导入/解析,就行不通。

混合语言

当然,您可以使用该语言的 native CSV 解析来读取每个文件,然后将它们“上传”到 Spark。在 R 中,这是一些包的组合,用于从 S3 中获取文件,然后是 read.csv ,并以 createDataFrame() 结束将数据导入 Spark。不幸的是,这真的很慢,而且似乎与我希望 Spark 的工作方式背道而驰。如果我的所有数据在进入 Spark 之前都通过 R 管道传输,那为什么还要使用 Spark?

Hive/Sqoop/Phoenix/Pig/Flume/Flume Ng/s3distcp

我已经开始研究这些量身定制的工具,但很快就不知所措。我的理解是,许多/所有这些工具都可用于将我的 CSV 文件从 S3 导入 HDFS。

当然,从 HDFS 读取我的 CSV 文件会比 S3 更快,这样可以解决部分问题。但是我仍然有数以万计的 CSV 需要解析,并且我不知道在 Spark 中以分布式方式进行解析。

最佳答案

所以现在(Spark 1.4)SparkR 支持 jsonparquet文件结构。可以解析 csv 文件,但随后需要使用额外的 jar 启动 spark 上下文(需要下载并放置在适当的文件夹中,我自己从未这样做过,但我的同事有)。

sc <- sparkR.init(sparkPackages="com.databricks:spark-csv_2.11:1.0.3")
sqlContext <- sparkRSQL.init(sc)

更多信息在 the docs .我希望更新的 Spark 版本会对此提供更多支持。

如果您不这样做,您将需要使用不同的文件结构或使用 python 来转换来自 .csv 的所有文件。进入 .parquet .这是最近进行的 Python 演讲中的一个片段。
data = sc.textFile(s3_paths, 1200).cache()

def caster(x):
return Row(colname1 = x[0], colname2 = x[1])

df_rdd = data\
.map(lambda x: x.split(','))\
.map(caster)

ddf = sqlContext.inferSchema(df_rdd).cache()

ddf.write.save('s3n://<bucket>/<filename>.parquet')

另外,你的数据集有多大?您甚至可能不需要 spark 进行分析。请注意,截至目前;
  • SparkR 仅支持 DataFrame。
  • 还没有分布式机器学习。
  • 对于可视化,如果您想使用像 ggplot2 这样的库,您需要将分布式数据帧转换回普通数据帧。 .
  • 如果您的数据集不超过几 GB,那么学习 spark 的额外麻烦可能还不值得
  • 现在很温和,但你可以期待 future 更多
  • 关于csv - 在 Spark 中高效聚合多个 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31795777/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com