Spark:spark-csv需要太长时间

时间:2015-08-28 07:33:50

标签: csv apache-spark pyspark

我正在尝试使用Databricks spark-csv包和flights dataset

从EMR Spark群集上的S3上的CSV源创建DataFrame
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

df = sqlContext.read.format('com.databricks.spark.csv').options(header='true').load('s3n://h2o-airlines-unpacked/allyears.csv')

df.first()

这不会在4 m3.xlarge个群集上终止。我正在寻找建议在PySpark中的S3上从CSV文件创建DataFrame。或者,我已尝试将文件放在HDFS上并从HFDS读取,但这也不会终止。该文件不是太大(12 GB)。

1 个答案:

答案 0 :(得分:1)

要读取只有12GB的行为良好的csv文件,您可以将其复制到所有工作人员和驱动程序计算机上,然后手动拆分","。这可能无法解析任何RFC4180 csv,但它解析了我的内容。

  • 在申请群集时,为每个工作人员添加至少12GB的工作磁盘空间空间。
  • 使用至少具有12GB RAM的计算机类型,例如c3.2xlarge。如果你不打算让集群保持闲置并且可以承担更大的费用,那么就要做得更大。更大的机器意味着更少的磁盘文件复制才能开始。我经常在现货市场看到c3.8xlarge低于0.50美元/小时。

将文件复制到每个工作者的每个工作者的同一目录中。这应该是一个物理连接的驱动器,即每台机器上的不同物理驱动器。

确保驱动程序计算机上也有相同的文件和目录。

raw = sc.textFile("/data.csv")

print "Counted %d lines in /data.csv" % raw.count()

raw_fields  = raw.first()
# this regular expression is for quoted fields. i.e. "23","38","blue",...
matchre = r'^"(.*)"$'
pmatchre = re.compile(matchre)

def uncsv_line(line):
    return [pmatchre.match(s).group(1) for s in line.split(',')]

fields = uncsv_line(raw_fields)

def raw_to_dict(raw_line):
    return dict(zip(fields, uncsv_line(raw_line)))

parsedData = (raw
        .map(raw_to_dict)
        .cache()
        )

print "Counted %d parsed lines" % parsedData.count()

parsedData将是dicts的RDD,其中dicts的键是来自第一行的CSV字段名称,值是当前行的CSV值。如果您在CSV数据中没有标题行,这可能不适合您,但应该清楚您可以覆盖读取第一行的代码并手动设置字段。

请注意,这对于创建数据框或注册spark SQL表并不是立即有用。但是对于其他任何事情,它都没关系,如果你需要将它转储到spark SQL中,你可以进一步提取并转换为更好的格式。

我在一个没有问题的7GB文件上使用它,除了我已经删除了一些过滤器逻辑来检测有效数据,这会产生从解析数据中删除标头的副作用。您可能需要重新实现一些过滤。