PySpark(Python):通过SparkContext.newAPIHadoopFile加载多行记录

时间:2016-07-02 15:55:10

标签: python hadoop pyspark hdfs

我正在加载一个带有TSV(表格分隔值)表示法的文本文件,但每行都没有键。因此,一行表示特定变量,所有后续行是该变量的值,直到出现新变量。

因此,我使用自定义分隔符加载文件(在Jupyter Notebook Python 2.7 - Pyspark中):

sheet = sc.newAPIHadoopFile(
    'sample.txt',
    'org.apache.hadoop.mapreduce.lib.input.TextInputFormat',
    'org.apache.hadoop.io.LongWritable',
    'org.apache.hadoop.io.Text',
    conf={'textinputformat.record.delimiter': 'var::'}
)

我的问题是,这种多行记录的大小怎么样?单个变量的值可能是数千行。 Spark是在一台机器上一次加载文件还是将该块拆分成较小的块(块)然后进行处理?

只是想确保内存不会在处理节点上爆炸。谢谢你的任何解释。

reading multiline records

1 个答案:

答案 0 :(得分:2)

o.a.h.mapreduce.lib.input.TextInputFormat返回的每个(键,值)对是包含偏移量(long)和字符串的单个本地数据结构。没有可以在不创建自定义Hadoop InputFormat的情况下在多个记录之间拆分值的机制。

"数千行"不是很精确的描述,但作为一个经验法则:

  • 如果磁盘大小小于几兆字节,那么您最有可能去。
  • 否则,您必须跟踪内存使用情况和GC并调整配置。

另请注意,大型记录可能导致资源利用率不佳。在最糟糕的情况下,每个任务最终会有一个记录,其中记账成本可能比实际执行高得多。