2015-12-21 82 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

你好霍爾登,謝謝你的回覆!這非常有幫助。 –