在Pyspark中使用Hadoop InputFormat

时间:2017-02-14 17:37:49

标签: python apache-spark pyspark

我正在研究Spark的文件解析器,它基本上可以一次读入 n 行,并将所有这些行作为单行放在数据帧中。
我知道我需要使用InputFormat来尝试指定,但我无法在Python中找到一个很好的指南。
有没有在Python中指定自定义InputFormat的方法,还是需要将其创建为scala文件,然后在spark-submit中指定jar?

2 个答案:

答案 0 :(得分:1)

您可以直接使用带有Pyspark的InputFormats。

引自documentation

  

PySpark还可以读取任何Hadoop InputFormat或编写任何Hadoop   OutputFormat,用于“新”和“旧”Hadoop MapReduce API。

HadoopInputFormat类传递给pyspark.SparkContext适合的任何方法

要阅读 n 行,org.apache.hadoop.mapreduce.lib.NLineInputFormat可以用作带有newAPI方法的HadoopInputFormat类。

答案 1 :(得分:1)

  

我无法在Python中找到一个很好的指南

在Spark文档中,在“保存和加载其他Hadoop输入/输出格式”下,有一个Elasticsearch示例+指向HBase示例的链接。

  

基本上可以一次读取n行...我知道我需要使用InputFormat来尝试指定

专门有NLineInputFormat

这是我对NLineInputFormat not working in Spark

的一些Scala代码的粗略翻译
def nline(n, path):
  sc = SparkContext.getOrCreate
  conf = {
    "mapreduce.input.lineinputformat.linespermap": n
  }

  hadoopIO = "org.apache.hadoop.io"
  return sc.newAPIHadoopFile(path, 
    "org.apache.hadoop.mapreduce.lib.NLineInputFormat", 
    hadoopIO + ".LongWritable", 
    hadoopIO + ".Text", 
    conf=conf).map(lambda x : x[1])  # To strip out the file-offset

n = 3
rdd = nline(n, "/file/input")
  

并将所有这些行放在数据框中的单行

使用NLineInputFormat,RDD中的每个字符串实际上都是新行分隔的。你可以rdd.map(lambda record : "\t".join(record.split('\n'))),例如把它们排成一行。