我正在尝试使用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)。
答案 0 :(得分:1)
要读取只有12GB的行为良好的csv文件,您可以将其复制到所有工作人员和驱动程序计算机上,然后手动拆分","。这可能无法解析任何RFC4180 csv,但它解析了我的内容。
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文件上使用它,除了我已经删除了一些过滤器逻辑来检测有效数据,这会产生从解析数据中删除标头的副作用。您可能需要重新实现一些过滤。