我正在研究Spark的文件解析器,它基本上可以一次读入 n 行,并将所有这些行作为单行放在数据帧中。
我知道我需要使用InputFormat
来尝试指定,但我无法在Python中找到一个很好的指南。
有没有在Python中指定自定义InputFormat
的方法,还是需要将其创建为scala文件,然后在spark-submit
中指定jar?
答案 0 :(得分:1)
您可以直接使用带有Pyspark的InputFormats。
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')))
,例如把它们排成一行。