2015-12-21 60 views
2

我想了解如何在Spark上比较类型String (java.lang.String)Text (org.apache.hadoop.io.Text)的序列化对象。任何一种类型都应该被用作RDD元素的关键。所以我想知道这些类型的对象的方式是否存在差异。这可能在下列情况有关:Spark的比较序列化对象rawcomparator

  1. RDD.saveAsObjectFileSparkContext.objectFile支持节能的RDD作为序列化对象,并加载它。

  2. StorageLevel.MEMORY_AND_DISK_SER作为调用RDD.persist()时提供的存储级别。

Hadoop提供RawComparator作为Java的Comparator的扩展。它允许比较从流中读取的对象,而不将其反序列化为对象。 WritableComparatorWritableComparable类型实现了RawComparator接口,例如Text,而String似乎没有实现。 [1,p。 96]

package org.apache.hadoop.io; 
import java.util.Comparator; 

public interface RawComparator<T> extends Comparator<T> { 

public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2); 

} 

所以问题是:如何处理Spark与那,p。恩。对于1和2情况下的RDD,当调用reduceByKey()时,如下面列表中所述? 这两种类型的对象是否可以进行反序列化,然后才能进行比较?或者有什么机制像Hadoop上的RawComparator接口? 我已经在文档中,在网络上甚至在Spark源中搜索过,但还没有找到答案。

JavaRDD<Tuple2<String,CustomType>> loadedParsedContents = sc.objectFile(pathToObjectFile); 
JavaPairRDD<String, CustomType> parsedContents 
    = loadedParsedContents.mapToPair(...); 
JavaPairRDD<String, CustomType> reducedContents = parsedContents.reduceByKey(...); 
reducedContents.count(); 

[1]白色T(2012)的Hadoop;权威指南。 O'Reilly,Sebastopol,CA.

感谢您的帮助!

回答

0

这是一个非常有趣的问题,答案在变化中。通常,Spark中的操作是在反序列化的对象上完成的 - 但Spark SQL中的这些操作正在发生变化,因为现在可以直接在序列化对象上完成一些操作。

+0

你好霍尔登,谢谢你的回复!这非常有帮助。 –