2015-09-12 55 views
0

您好我有Java的String數組,它包含45字符串,它基本上是列名如何從Java String數組創建Spark廣播變量?

String[] fieldNames = {"colname1","colname2",...}; 

目前我儲存在Spark驅動程序字符串的上述陣列中的一個靜態字段。我的工作運行緩慢,因此試圖重構代碼。我使用上面的字符串數組,同時創造一個數據幀

DataFrame dfWithColNames = sourceFrame.toDF(fieldNames); 

我想做的事情上面使用廣播變量,它不船舶巨大的字符串數組,遺囑執行人,我相信我們可以做類似下面創建廣播

String[] brArray = sc.broadcast(fieldNames,String[].class);//gives compilation error 

DataFrame df = sourceFrame.toDF(???);//how do I use above broadcast can I use it as is by passing brArray 

請指導我是Spark新手。非常感謝。

回答

3

sc.broadcast的返回變量的類型爲Broadcast<String[]>而不是String[]。當你想訪問這個值時,你只需在變量上調用value()。從你的例子它會像:

Broadcast<String[]> broadcastedFieldNames = sc.broadcast(fieldNames) 
DataFrame df = sourceFrame.toDF(broadcastedFieldNames.value()) 

請注意,如果您在使用Java編寫這一點,你可能想在JavaSparkContext內包裹SparkContext。它使一切都變得簡單,並且您可以避免必須將ClassTag傳遞給廣播功能。

您可以在http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables

+0

JavaSparkContext的解釋很好,所以我不必包含可選項。 – raksja

2

閱讀更多關於廣播變量這是一個有點老的問題,但是,我希望我的解決方案將幫助別人。

爲了播放任何物體(可以是單個POJO或收集)星火2+,你首先需要有下面的方法,爲您創建一個classTag:

private static <T> ClassTag<T> classTag(Class<T> clazz) { 
    return scala.reflect.ClassManifestFactory.fromClass(clazz); 
} 

下次使用JavaSparkContext從SparkSession廣播你的對象如以前:

sparkSession.sparkContext().broadcast(
      yourObject, 
      classTag(YourObject.class) 
    ) 

在收集的情況下,比如說,java.util.List中,您使用以下命令:

sparkSession.sparkContext().broadcast(
      yourObject, 
      classTag(List.class) 
    )